sql >> データベース >  >> RDS >> Mysql

mysqlは、使用可能なタイムスロットとテーブルからビジーなタイムスロットを表示します

    OK、純粋なMySQL-それらのトリックが好きである限り。通常のnow()のように、表示する期間の「開始」に初期化される変数が必要です。

    まず、テストデータのみ:

    create table bookingEvents 
       (id int not null primary key auto_increment,
        timeBooked datetime, 
        duration int
       );
    
    
    insert into bookingEvents values (null, '2013-05-13 13:22:00', 15);
    insert into bookingEvents values (null, '2013-05-13 15:10:00', 45);
    insert into bookingEvents values (null, '2013-05-13 19:55:00', 30);
    insert into bookingEvents values (null, '2013-05-14 03:22:00', 15);
    insert into bookingEvents values (null, '2013-05-14 08:19:00', 15);
    

    次に、「スライダー」を初期化します。

    set @timeSlider='2013-05-10 00:00:00';
    

    次に、次を選択します:

    select if (d.name = 'Free', @timeSlider, b.timeBooked) as free_from,
           if (d.name = 'Free', b.timeBooked, @timeSlider := b.timeBooked + interval b.duration minute) as free_until,
           d.name as Free
    from (select 1 as place, 'Free' as name union select 2 as place, 'Booked' as name) d 
    inner join bookingEvents b 
    having free_from < free_until
    order by b.timeBooked, d.place;
    

    結果:

    +---------------------+---------------------+--------+
    | free_from           | free_until          | Free   |
    +---------------------+---------------------+--------+
    | 2013-05-10 00:00:00 | 2013-05-13 13:22:00 | Free   |
    | 2013-05-13 13:22:00 | 2013-05-13 13:37:00 | Booked |
    | 2013-05-13 13:37:00 | 2013-05-13 15:10:00 | Free   |
    | 2013-05-13 15:10:00 | 2013-05-13 15:55:00 | Booked |
    | 2013-05-13 15:55:00 | 2013-05-13 19:55:00 | Free   |
    | 2013-05-13 19:55:00 | 2013-05-13 20:25:00 | Booked |
    | 2013-05-13 20:25:00 | 2013-05-14 03:22:00 | Free   |
    | 2013-05-14 03:22:00 | 2013-05-14 03:37:00 | Booked |
    | 2013-05-14 03:37:00 | 2013-05-14 08:19:00 | Free   |
    | 2013-05-14 08:19:00 | 2013-05-14 08:34:00 | Booked |
    +---------------------+---------------------+--------+
    

    特定の終了タイムスタンプがある場合は、それを@timeMaximumとして事前設定する必要があります

    set @timeSlider='2013-05-10 00:00:00';
    set @timeMaximum='2013-05-14 08:35:00';
    
    
    select if (d.name = 'Free', @timeSlider, b.timeBooked) as free_from,
           if (d.name = 'Free', b.timeBooked, @timeSlider := b.timeBooked + interval b.duration minute) as free_until,
           d.name as Free
    from (select 1 as place, 'Free' as name union select 2 as place, 'Booked' as name ) as d 
    inner join bookingEvents b 
    having free_from < free_until
    union select @timeSlider as free_from, @timeMaximum as free_until, 'Free' as Free
    from (select 1) as d
    where @timeSlider < @timeMaximum
    
    order by free_from, free_until
    ;
    


    1. インド、PHP、MYSQL、JQUERYのSTDコードファインダースクリプト

    2. ループを使用して、各DISTINCTフィールド値を1回だけ表示します

    3. Bcryptハッシュパスワードをデータベースに保存するためにどの列タイプ/長さを使用する必要がありますか?

    4. MySqlデータベースをFirebaseに接続する方法は?