2011-04-06 80 views
0

可能重複:
How can I determine in SQL Server if a dateTime range overlaps anotherSQL Server和BETWEEN

嗨, 我想,以確定是否給定的開始時間,並與另一條記錄的結束時間衝突。我目前使用下面的查詢,如果我得到的1個或多個結果,我知道它已經發生衝突:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    AND @StartTime BETWEEN Sheet.StartTime AND Sheet.EndTime 
    OR @EndTime BETWEEN Sheet.StartTime AND Sheet.EndTime 

這種運作良好,但一個真正的用戶應該能夠進入相同的開始時間之前的結束時間,即。上班時間是早上6點,新工作開始時間是早上6點。上述查詢不允許出現這種情況。

我有一種感覺,我可能需要使用大於和小於,而不是之間,但很想聽到任何建議。

在此先感謝

回答

0

使用「大於(小於)」是表現更好,所以微軟建議這一條款。你應該使用它。

0

正如你已經想通了,該BETWEEN運算符是包容性(見文檔here)。

我認爲你需要做到以下幾點:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    (@StartTime > Sheet.StartTime AND @StartTime < Sheet.EndTime) 
    OR (@EndTime > Sheet.StartTime AND @EndTime < Sheet.EndTime) 

請注意,我並沒有把在> =或< =運營商,因爲這會阻止你想允許早上6點結束/早上6點開始的情況。

編輯剛剛有一個想法 - 如果新工作表沒有在現有工作表的範圍內開始或結束,但其中包含整個其他工作表?會發生嗎?例如,你有開始在凌晨2點和凌晨4點結束一個現有表記錄。您嘗試插入一個新的開始於凌晨1點和早上5點結束。你的查詢(和我原來的)會允許這個!

你必須修改它,如下所示:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    (@StartTime > Sheet.StartTime AND @StartTime < Sheet.EndTime) 
    OR (@EndTime > Sheet.StartTime AND @EndTime < Sheet.EndTime) 
    OR (@StartTime < Sheet.StartTime AND @EndTime > Sheet.EndTime) 
0

定義「與衝突」 ......但如果你的意思是「重疊」,則條件應該是:

WHERE @StartTime < Sheet.EndTime AND @EndTime > Sheet.StartTime 

您可以選擇「<=」或「>=」而不是「<」或「>」如果你想要完全一樣的瞬間計數。

該條件檢查@StartTime中的值出現在工作表結束之前,並且@EndTime中的值發生在工作表開始之後。如果這兩個條件都滿足,在工作表的條目以@[email protected]重疊。