3

dt(DateTime)とisblocked(Bit)の2つのフィールドを持つテーブルがあります

ここに画像の説明を入力してください

私がやろうとしているのは、開始日時に基づいて、45分が継続的に無料である2つの日時の間の期間を見つけることです。

例:上記の表に基づいて、開始日として2012-12-1113:30:00'を使用します。次のような値が必要になります。

2012-12-11 15:30:00
2012-12-11 16:45:00

次のような最小および最大クエリを試しました。

SELECT MIN(dt), isbooked
FROM booking
WHERE dt >= '2012-12-11 13:30:00' AND isbooked = 1
GROUP BY dt
LIMIT 1;

しかし、私は正しい構造をまとめることができないようです。さらに情報が必要な場合は、私に知らせてください。

4

4 に答える 4

2

MySQL では、相関サブクエリを使用してこれを行うことができます。

select min(b.dt) as StartTime, NotBookedTime as EndTime
from (select b.*,
             (select min(b2.dt) from booking b2 where b2.dt >= b.dt and b2.isbooked = 1
             ) as NotBookedTime
      from booking b
     ) b
where b.isbooked = 0
group by NotBookedTime
having date_add(min(b.dt), interval 45 minute) <=  NotBookedTime

これが行うことは、各レコードの最初に予約された間隔を見つけ、時間を記憶することです。次に、最初に予約された間隔を見つけ、その差が 45 分以上になるかどうかを確認します。

于 2012-12-11T20:52:31.480 に答える
1

これも機能するはずです:

SELECT d.dt
FROM (
  SELECT
    t1.dt,
    MIN(case when t2.isBooked then t2.dt end) AS next_booked,
    MAX(case when not t2.isBooked then t2.dt end) as max_unbooked
  FROM times t1 INNER JOIN times t2 ON t1.dt < t2.dt
  WHERE t1.isBooked =0
  GROUP BY t1.dt
) d
WHERE
  timediff(next_booked,d.dt)>='00:45:00' or
  (next_booked is null and timediff(max_unbooked,d.dt)>='00:30:00')

あなたが求めているものに応じて、次のように単純化することもできます:

SELECT d.dt
FROM (
  SELECT
    t1.dt,
    MIN(t2.dt) as next_booked
  FROM times t1 left  JOIN times t2 ON t1.dt < t2.dt and t2.isBooked=1
  WHERE t1.isBooked =0
  GROUP BY t1.dt
) d
WHERE timediff(d.next_booked, d.dt)>='00:45:00'
      or d.next_booked is null
GROUP BY d.next_booked
于 2012-12-11T21:00:48.123 に答える
0

このSQLFiddleをチェックしてください

SELECT min(b.dt) AS StartTime, NotBookedTime AS EndTime
FROM (SELECT b.*,
        (SELECT min(b2.dt) FROM DT b2 
           WHERE b2.dt >= b.dt AND b2.isBooked = 1
         ) AS NotBookedTime
     FROM DT b
    ) b
WHERE b.isBooked = 0
GROUP BY NotBookedTime
HAVING EndTime is not null
于 2012-12-11T21:01:38.653 に答える
0

変数を使用できます:

set @tp=now();
SELECT @tp:=dt as dt,isbooked FROM booking WHERE 
    dt >= addtime(@tp,'00:45:00') AND isbooked = 1
    ORDER BY dt;

ここ@TPで、選択した前の日付の値を取ります。

于 2012-12-11T21:08:31.923 に答える