2010-04-26 94 views
2

我正在爲我們的網站撰寫廣告預訂系統。廣告以StartDateEndDate字段進行預訂,以指示他們在線多長時間。MySQL:查找具有衝突日期範圍的行

添加新廣告時,我有一個快速驗證檢查,以確保新廣告不會與預訂到同一位置的現有廣告發生衝突。

我認爲我與此查詢過它:

SELECT * 
FROM adverts 
WHERE EndDate >= '2010-04-22' 
AND StartDate < '2010-04-22' 

2010-4-22是StartDate新廣告我想預訂。有一個廣告已經預訂,其中StartDate是2010-04-26,EndDate是2010-05-09。

這些是不同日期查詢的結果:


  • 嘗試預訂廣告開始在現有的廣告結束後:返回0行(正確)

  • 嘗試預訂在現有廣告的日期範圍內開始和結束的廣告:返回1行(正確)

  • 嘗試預訂廣告的開始和結束前的現有廣告開始:返回0行 (正確)

  • 先試現有的廣告開始,經久不衰在現有廣告的日期預訂開始廣告範圍:返回0行(不正確)

  • 嘗試預訂出發前和結束後,當前廣告結尾的廣告:(!不正確的)返回0行


有沒有人有任何想法如何重寫這個查詢,所以我可以確保它只會在日期範圍內發生衝突?

謝謝, 馬特

回答

6
SELECT * 
    FROM adverts 
WHERE `EndDate` >= :AdStartDate 
    AND `StartDate` <= :AdEndDate 

我沒有佔優勢的情況下開始和結束日期是平等的,因爲我不知道你的規則是這一點。

+0

這看起來像解決方案 - 我發誓我試着開始,猜測我的邏輯困惑。謝謝!我的開始/結束日期的規則是相同的,但是這個代碼無論如何都會迎合這種情況 - 它會返回1行。謝謝! – 2010-04-26 12:34:35