2012-11-23 50 views
1

我有這個mysql表中有以下記錄。選擇給定的start_datetime和end_datetime的所有行

表名: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,它不返回我的任何結果,如果我這樣做,而參照上述記錄我希望它返回我的行ID爲7,因爲我在2:0018:00之間預訂的時間段,因此與02:0018:00之間的時間匹配的任何給定值應該返回一行。

什麼是適當的MySQL查詢來處理我的問題?

這裏是鏈接到sqlfiddle如果你想玩記錄和架構。

回答

1

在新預訂結束時或之後開始預訂,或者在新預訂開始時或之前結束的預訂沒有問題。

因此,您需要查找的預訂​​是在新預訂結束前開始的預訂,並在新預訂開始後結束。然後

您所查詢的是768,16

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 
+0

這是工作很好,非常感謝你:) –

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) 
+0

不工作:(,@anand你可以看看這個鏈接,看看它是否返回正確的記錄。http://sqlfiddle.com/#!2/ca82d/1 –

+0

嘗試更新的查詢 – AnandPhadke

+0

什麼是end_time,哪裏是arena_surface_id條件? –

3

查詢發現重疊預訂如下。只需要再添加一個檢查,以查找我們正在搜索的插槽是否位於數據庫中已經預訂的插槽中。 它與搜索欄的開始日期和結束日期一樣都是在已經預訂的欄位中。

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) 
相關問題