1

私は次のレコードを持つこの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_datetimeend_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:0018:0002:0018:00

私の問題に対処するための適切なmysqlクエリは何でしょうか?

レコードとスキーマを試してみたい場合は、 sqlfiddleへのリンクを次に示します。

4

3 に答える 3

3

重複する予約を見つけるためのクエリを以下に示します。検索しているスロットがデータベースですでに予約されているスロットにあるかどうかを確認するために、もう1つチェックを追加する必要があります。検索スロットの開始日と終了日の両方が、すでに予約されているスロットにあるようなものです。

SELECT 
    id, start_datetime, end_datetime, arena_surface_id 
FROM 
    gce_arena_surface_booking 
WHERE (
    (start_datetime BETWEEN '2012-11-23 2:30' AND '2012-11-23 6:00') OR 
    (end_datetime BETWEEN '2012-11-23 2:30' AND '2012-11-23 6:00')

  OR '2012-11-23 2:30' BETWEEN start_datetime AND end_datetime


) 
AND arena_surface_id = 2

データベース内の重複していないスロットを見つける必要がある場合は、以下のクエリを使用してください。上記の否定です。

SELECT * FROM `gce_arena_surface_booking`
WHERE (`arena_surface_id`=2)
AND
(start_datetime NOT BETWEEN '2012-11-23 02:30:00' AND '2012-11-23 06:00:00')
AND
(end_datetime NOT BETWEEN '2012-11-23 02:30:00' AND '2012-11-23 06:00:00')
AND
('2012-11-23 02:30:00' NOT BETWEEN start_datetime AND end_datetime)
于 2012-11-26T05:40:49.830 に答える
1

新規予約の終了時または終了後に開始する予約、または新規予約の開始時または開始前に終了する予約は問題ありません。

したがって、検索する必要のある予約は、新しい予約が終了する前に開始し、新しい予約が開始した後に終了する予約です。

あなたの質問はそうすべきです

SELECT id, start_datetime, end_datetime, arena_surface_id 
FROM gce_arena_surface_booking 
WHERE ('2012-11-23 6:00' > start_datetime)
AND ('2012-11-23 2:00' < end_datetime)
AND arena_surface_id = 2
于 2012-11-23T11:28:37.827 に答える
1
   SELECT 
        id, start_datetime, end_datetime, arena_surface_id 
    FROM 
        gce_arena_surface_booking 

    Where ('2012-11-23 2:30' between start_datetime and end_datetime)
    and ('2012-11-23 6:00' between start_datetime and end_datetime)
于 2012-11-23T10:36:04.207 に答える