2013-09-05 44 views
2

我試圖獲取存儲在數據庫表中的所有事件,這些事件在用戶給定的特定範圍內。它會一直工作到事件跨越多天。此時結束日期不在時間範圍內,查詢將丟棄它。我的問題是如何獲得落在給定範圍內的所有事件,無論它們是在範圍之前開始並在範圍內結束,還是在範圍內開始並結束。我必須從結果全部排除在這個範圍後開始或結束的範圍從跨越多天的數據庫中獲取事件

CREATE TABLE IF NOT EXISTS `events` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '', 
    `start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `end` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1; 

當前查詢之前的事件

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
    FROM events t0_ 
    WHERE t0_.start > start 
    AND t0_.end < end 

示例數據:

name      start     end 
--------------------  --------------------  -------------------- 
test event    2012-02-17 09:00:00  2012-02-17 09:50:00 
test event2    2012-02-17 09:00:00  2012-02-19 09:00:00 
test event3    2012-02-12 09:00:00  2012-02-17 09:00:00 
test event4    2012-02-12 09:00:00  2012-02-13 09:00:00 

預期結果數據:

name      start     end 
--------------------  --------------------  -------------------- 
test event    2012-02-17 09:00:00  2012-02-17 09:50:00 
test event2    2012-02-17 09:00:00  2012-02-19 09:00:00 
test event3    2012-02-12 09:00:00  2012-02-17 09:00:00 

使用範圍:

2012-02-17 00:00:00 - 2012-02-17 23:59:59 

,你可以看到我採取的是給定範圍內的事件,加上開始在後的範圍和結束的事件和範圍之前啓動,但裏面結束事件。

+0

您是否嘗試過使用BETWEEN?開始BETWEEN date1和date2或結束BETWEEN date1和date2 –

+0

選擇日期時,請注意'<' ,'>','<=', '> ='和'BETWEEN'。我認爲你的查詢需要'<=' and '> =',它的投射方式。 –

+0

你能更詳細地解釋你想要的搜索條件嗎?多日活動應該發生什麼?如果多日事件的任何一天在您搜索的範圍內,是否應該找到? 「日」是什麼意思 - 午夜到午夜?或者從賽事開始的24小時內開始?建議你寫出幾個例子,並解釋爲什麼應該包括或排除它們。 –

回答

1

最簡單的辦法是否定做到這一點:

SELECT t0_.name AS name0, t0_.start AS start3, t0_.end AS end4 
FROM events t0_ 
WHERE 
    NOT(
     t0_.end < '2013-09-05 00:00:00' 
     OR t0_.start > '2013-09-06 23:59:59' 
    ) 

這樣,你過濾掉範圍之前結束,範圍之後開始的所有事件。

+0

您爲什麼要使用2013-09-06 23:59:59而不是2013-09-05 23 :59:59? – Stefano

+0

我不知道。也許這是你的問題在一些編輯之間的結束日期。 –

+0

該查詢似乎工作,謝謝。我不知道自己怎麼也想不出來 – Stefano