2013-05-20 62 views
0

之間記錄我有以下查詢將檢索作爲參數提供的開始日期和結束日期之間的事件:檢索日期

SELECT * FROM events 
WHERE (startDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME) 
OR endDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME)) 

這工作得很好,爲獲取重疊的開始和結束時間的事件,但將不會得到那些時代之間完全封裝的事件。一張圖片可能會使它變得清晰:

Event A |------------------------------------------------------------------| Event B ----------------------|------------|-------------------------------

Where | represents a start or end date

在我的照片,用我的查詢與開始和結束時間爲事件B,它不會檢索事件A

如何更改查詢以便顯示所有重疊和封裝的事件?

+0

您可能還想考慮使用[half-open intervals](http://stackoverflow.com/a/16282246/634824) –

回答

2
SELECT * FROM events 
WHERE (startDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME) 
OR endDate BETWEEN CAST(@start AS DATETIME) AND CAST(@end AS DATETIME)) 
OR (endDate >= CAST(@end AS DATETIME)) AND startDate <= CAST(@end AS DATETIME)) 

最後OR線將增加所有行開始比你的最終參數小,到底是比大。這樣,與@end重疊的所有行都將被匹配。你也可以嘗試:

SELECT * FROM events 
WHERE 
(startDate <= CAST(@start AS DATETIME)) AND endDate >= CAST(@start AS DATETIME)) 
OR (endDate >= CAST(@end AS DATETIME)) AND startDate <= CAST(@end AS DATETIME)) 

應該匹配你想要的一切。它匹配記錄在startend上的所有記錄。如果你想要匹配startend中包含的所有內容,但不要與它們中的任何一個重疊,也許你必須將它們結合起來。

+0

當然!我看不到它盯着它這麼久:)感謝您的幫助 – peacemaker

+0

@peacemaker不客氣。當我剛剛將它編輯爲答案及其重要內容時,請看看最後一句。 –

1

你要做

SELECT * FROM events 
WHERE (startDate <= CAST(@end AS DATETIME) AND endDate >= CAST(@start AS DATETIME) 
+0

我不認爲這涵蓋了開始和結束重疊開始或其他事件結束。即如果事件A從10:00開始,在12:00結束,我搜索09:00至11:00。 – peacemaker

+0

是的,它會覆蓋。它涵蓋了所有情況。 – Rodrigo