2016-05-31 95 views
0

我試圖找到合適的查詢,檢查日期和時間範圍在MySQL表重疊,這裏是表:如何在沒有重疊存儲日期和時間範圍在MySQL

id  pickup_date  pickup_time  return_date  return_time 
1  2016-05-01  12:00:00  2016-05-31  13:00:00 
2  2016-07-01  12:00:00  2016-07-04  15:00:00 

這裏有對「保留」表進行檢查哪些快到了,需要每一個預訂數據:

pickup_date = '2016-04-01'; 
pickup_time = '12:00:00' 
return_date = '2016-05-01'; 
return_time = '13:00:00' 

與此數據的保留重疊一個在數據庫中。請注意:新的預訂可以在過去或未來。

EDIT(所建議的spencer7593,這也是目前爲止工作版本):

SET @new_booking_pickup_date = '2016-04-01'; 
    SET @new_booking_pickup_time = '12:00:00'; 
    SET @new_booking_return_date = '2016-05-01'; 
    SET @new_booking_return_time = '13:00:00'; 

    SELECT * FROM Reservation WHERE NOT 
(CONCAT(@new_booking_pickup_date,' ',@new_booking_pickup_time) > CONCAT(return_date,' ',return_time) + INTERVAL 0 DAY OR CONCAT(@new_booking_return_date,' ',@new_booking_return_time) < CONCAT(pickup_date,' ',pickup_time) + INTERVAL 0 DAY); 

,所以會導致此查詢:

id  pickup_date  pickup_time  return_date  return_time 
1  2016-05-01  12:00:00  2016-05-31  13:00:00 

回答

1

這是很容易,以確定是否給定期間不與另一期間重疊。

爲了便於表達比較,對於期間1,我們將讓開始和結束由b1和e1表示。期間2,b2和e2。

沒有重疊,若符合下列條件:(我們可以狡辯的B1和E2平等是否會被認爲是重疊或沒有,並根據需要調整)

b1 > e2 OR e1 < b2 

的該測試的否定會返回TRUE,如果有重疊......

NOT (b1 > e2 OR e1 < b2) 

因此,以找出是否有一個排,經過擬議期重疊,我們需要一個查詢,測試是否返回一行...

我們假設我們要檢查的表有stet(DATETIME)表示每個週期的開始和結束的列。

要找到與提議的期限由b1e1

SELECT t.* FROM t WHERE NOT (b1 > t.et OR e1 < t.st) 

所以對於查詢只檢查一個重疊行的存在界定的重疊的幾行,我們可以做這樣的事情:

SELECT EXISTS (SELECT 1 FROM t WHERE NOT (b1 > t.et OR e1 < t.st)) 

這很簡單。


這將平添了幾分複雜,當我們爲一個日期爲單獨列datetime組件(如問題所示)的(莫名)分裂的調整。

將單獨的日期和時間值合併到一個值爲DATETIME數據類型中,這只是一個簡單的問題。

我們需要做的就是將上面的查詢替換爲適當的轉換,例如,

st => CONCAT(pickup_date,' ',pickup_time) + INTERVAL 0 DAY 
    et => CONCAT(return_date,' ',return_time) + INTERVAL 0 DAY 

b1e1相同。

做這個替換,提出最後的查詢,留給任何人決定將日期和時間作爲單獨列存儲是一個好主意。

+0

非常感謝。我將在稍後嘗試 – eXtreme

+0

我省略了上述工作的一些要求......必須保證b1,e1,st等是**'DATETIME' **數據類型,並保證爲真... **(b1 <= e1 AND st <= et)**(這保證了句點的開始在句點結束之前,這又保證了開始和結束都是非空的。) – spencer7593

+0

我需要+ INTERVAL 0 DAY,因爲(+ INTERVAL)不受DQL支持(我需要在DQL而不是SQL中查詢) – eXtreme