簡體   English   中英

Mysql查詢,看看預訂是否會與另一個預訂發生沖突。

[英]Mysql query to see if a booking will conflict with another booking.

我有一張桌子可以存放一堆書。 客戶可以在白天的任何時間預約。 我想確保預訂不存在會與新預訂沖突。

所以我想在那個日期找到預訂,並檢查開始和結束時間是否重疊。 我嘗試使用子選擇查詢來獲取當天的預訂,然后查看這些時間是否重疊但它似乎沒有起作用。

這是我正在使用的查詢。 (狀態和活動是我需要的其他一些領域)。 我找到相關的日期,然后看看早上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)

這是最好的使用方法嗎? 謝謝

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

這意味着新約會(8至9:40)完全位於現有的appt內。 相反,你想(我認為)看看appt的開頭或結尾是否與另一個重合:

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.

要檢查一個范圍是否與另一個范圍重疊,當它不重疊然后反轉條件時,更容易先思考。 很明顯:

如果A在B結束后開始,或者如果A在B開始之前結束,則兩個范圍(A,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'

這樣您就可以處理所有極端情況,例如一個完全包含另一個的區間。

我遇到了同樣的問題,我使用了發布的解決方案,但是如果前一條記錄位於新記錄中,我發現了另一個錯誤示例

數據庫中的記錄是starttime 8:30:00 endtime 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')
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM