私は次のレコードを持つこのmysqlテーブルを持っています。
テーブル名:gce_arena_surface_booking
+----+---------------------+---------------------+------------------+
| id | start_datetime | end_datetime | arena_surface_id |
+----+---------------------+---------------------+------------------+
| 1 | 2012-11-22 02:30:00 | 2012-11-22 05:00:00 | 2 |
| 2 | 2012-11-22 00:00:00 | 2012-11-22 02:30:00 | 2 |
| 3 | 2012-11-22 05:00:00 | 2012-11-22 08:00:00 | 2 |
| 4 | 2012-11-22 08:00:00 | 2012-11-22 11:00:00 | 2 |
| 5 | 2012-11-22 11:00:00 | 2012-11-22 17:00:00 | 2 |
| 6 | 2012-11-22 17:30:00 | 2012-11-22 22:00:00 | 2 |
| 7 | 2012-11-23 02:00:00 | 2012-11-23 18:00:00 | 2 |
+----+---------------------+---------------------+------------------+
指定された日時までに予約がすでに存在するかどうかを知る必要があります。このクエリを使用して、指定された予約が存在するかどうかを確認していますstart_datetime
。end_datetime
SELECT
id, start_datetime, end_datetime, arena_surface_id
FROM
gce_arena_surface_booking
WHERE (
(start_datetime BETWEEN '2012-11-23 2:00' AND '2012-11-23 6:00') OR
(end_datetime BETWEEN '2012-11-23 2:00' AND '2012-11-23 6:00')
)
AND arena_surface_id = 2
上記のクエリは、たとえば、値を次のように変更した場合に問題を引き起こします。
'2012-11-23 2:00' AND '2012-11-23 6:00'
に
'2012-11-23 2:30' AND '2012-11-23 6:00'
2:00
値をからに変更したことに注意してください。変更し2:30
ても結果は返されませんが、上記のレコードを参照すると、ととの7
間にタイムスロットが予約されているため、 idの行が返されると予想されます。したがって、との間の時間に一致する任意の値は、行を返す必要があります。2:00
18:00
02:00
18:00
私の問題に対処するための適切なmysqlクエリは何でしょうか?
レコードとスキーマを試してみたい場合は、 sqlfiddleへのリンクを次に示します。