2014-01-10 31 views
1

我想查找時間衝突,但它不會爲以下記錄提供正確的結果。 我想返回時隙的真實時間 - 「t1.starttime到t2.endtime」,因爲此時隙與「t2.starttime和t2.endtime」衝突,因爲7到12時間覆蓋了8到11.30的某些時間。如何在SQL查詢中查找時隙衝突

t1.StartTime  t1.EndTime  t2.StartTime  t2.EndTime 
---------------- ---------------- ---------------- ---------------- 
07:00:00.0000000 12:00:00.0000000 08:00:00.0000000 11:30:00.0000000

我執行下面的查詢,但它不給我結果。

SELECT 
    count(1) 
FROM 
    t1 INNER JOIN t2 ON 

    CAST(t1.StartTime as TIME) 
    BETWEEN CAST(t2.StartTime as TIME) 
    AND CAST(t2.EndTime as TIME) OR CAST(t1.EndTime as TIME) 
    BETWEEN CAST(t2.StartTime as TIME) 
    AND CAST(t2.EndTime as TIME) 
+0

您是否搜索過:[tsql]或[sql-server]或[sql-server-2008]或[sql-server-2008-r2]或[sql-server-2005]重疊範圍 – HABO

+0

如果您真的嘗試按照你自己的查詢,你會注意到7不在8到11:30之間,而12也不是。所以當然你的條件沒有得到滿足。請參閱戈登的正確邏輯答案。通常有助於實際拿一張紙,並嘗試用線條重疊的時間段來描繪問題。繪製所有可能的重疊,並查看每種情況下每行的開始和結束之間可以找到的邏輯關係。 – oerkelens

+1

你應該閱讀這篇文章(http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) 。 – Zane

回答

7

重疊的正確的邏輯是簡單一點:

SELECT count(1) 
FROM t1 INNER JOIN 
    t2 
    ON CAST(t1.StartTime as TIME) < CAST(t2.EndTime as TIME) and 
     CAST(t1.EndTime as TIME) > CAST(t2.StartTime as TIME); 

的邏輯是一個時間間隔的另一端之前開始,另一個開始之後結束。

+0

+1當然邏輯的邏輯,但也沒有改變一個連接條件優雅使用一個'在哪裏'如在OP的早期問題中發生:) – oerkelens

+0

謝謝!作品。 – dsi