2013-07-11 26 views
1

我有一張存放一堆書的桌子。客戶可以在一天中的任何時間預約。我想確保預訂不存在,這將與新預訂相沖突。Mysql查詢以查看預訂是否與另一個預訂衝突。

所以我想找到那天的預訂,並檢查開始和結束時間不重疊。我試圖用子選擇查詢來獲取那天的預訂,然後看看那些時間是否重疊,但它似乎沒有工作。

這是我正在使用的查詢。 (狀態和活動是我需要的一些其他領域)。我找到相關的日期,然後看看早上8點是在這些結果之間的個人開始/結束時間還是早上9點40分也在開始/結束時間之間。

SELECT event_date, starttime, endtime, status, active 
FROM (SELECT event_date, starttime, endtime, status, active FROM bookings WHERE event_date='2013-07-21' AND status != 'cancelled' AND active !=0 LIMIT 1) AS q1 
WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime) 

這是一個最好的方法使用?由於

+0

得到了一個確切的問題和答案,我正在尋找(y)。 – NullPointer

回答

1

要檢查是否一個範圍重疊另一個更容易首先想到時候會不會重疊,然後反轉的條件。很明顯的是:

兩個範圍(A,B)重疊如果A了B結束後,或者如果B端開始之前。

談到這SQL您會收到以下條件找到的重疊範圍:

... WHERE NOT ('8:00:00' > q1.endtime OR '9:40:00' < q1.starttime) 

如果你願意,你可以重寫爲:

... WHERE q1.endtime > '8:00:00' AND q1.starttime < '9:40:00' 

這樣你處理所有的像一個間隔完全包含另一個間隔。

+0

非常感謝!這工作。 – Kat

4

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

這意味着新的約會(8至9:40),完全在於內部的現有聘任。相反,你想要的(我認爲),看看是否開始或將聘任的結束與另一個一致:

WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)

而且,我敢肯定,內部的選擇是不必要的。我相信這將有同樣的效果:

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)) 
-- if you get a row, then there is a conflicting appt. 
+0

我嘗試過,但它仍然沒有給我結果,但下面的其他選項工作在我的情況。謝謝您的幫助。 – Kat

+0

朋友,你節省了我寶貴的時間(y)。 – NullPointer

1

我跑同樣的問題,我用的發佈解決方案,但沒有,我發現,如果之前的紀錄是橫亙在新的記錄爲例

在數據庫中的記錄是 開始時間8另一個錯誤: 30:00 結束時間9:00:00

在這種情況下,該記錄將被添加爲找不到匹配的行會與此

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime)) 

找到解決這個問題,您需要檢查,如果開始時間或時間結束它本身就在於你的新條目之間

SELECT TOP 1 event_date, starttime, endtime, status, active 
FROM bookings 
WHERE event_date='2013-07-21' 
    AND status != 'cancelled' 
    AND active != 0 
    AND (('8:00:00' BETWEEN q1.starttime AND q1.endtime) 
     OR ('9:40:00' BETWEEN q1.starttime AND q1.endtime) 
     OR (q1.starttime BETWEEN '8:00:00' AND '9:40:00') 
     OR (q1.endtime BETWEEN 8:00:00' AND '9:40:00') 
)