2012-05-27 148 views
0

我有一張表,其中包括Time類型的兩列StartTimeEndTime。我想檢索StartTimeEndTime與某個輸入時間範圍衝突的行。在SQL Server 2008中基於時間檢索行

假設表包含這些行:

ID Status StartTime EndTime 
-- ------ --------- -------- 
0  0 08:00:00 08:50:00 
1  1 08:50:00 09:40:00 

而且我希望有與範圍08:00:00衝突 - 08:40:00。它應該返回第一行。

我試圖做到這一點是:

SELECT * 
FROM MyTable 
WHERE 
StartTime BETWEEN '08:00:00' AND '08:40:00' 
OR 
EndTime BETWEEN '08:40:00' AND '08:40:00' 

我會非常非常感謝,如果有人解決我這個問題。

回答

4

同意@John Dewey,如果你想找到一個特定的範圍衝突的範圍,你的條件似乎不完整的,因爲,正如John有正確指出,如果指定範圍完全落在表中某個範圍的邊界之間,則相應的行將不符合您的條件。

但是,而不是讓你的病情比較複雜,你其實可以更簡單,像這樣:

SELECT * 
FROM MyTable 
WHERE StartTime <= '08:40:00' AND EndTime >= '08:00:00' 
1
SELECT * 
FROM MyTable 
WHERE 
    StartTime BETWEEN '08:00:00' AND '08:40:00' 
OR EndTime BETWEEN '08:00:00' AND '08:40:00' 
1

您的第二個子句應該是EndTime BETWEEN '08:00:00' AND '08:40:00'。否則,你有什麼應該工作。

+0

哦,對不起。這是錯字。 – Ammar

0

只返回第一條記錄,使用TOP當確定什麼是「第一個」使用記錄TOP一定包括ORDER BYunion是因爲我假設'第一'值可以由開始時間或結束時間確定。必須在子查詢中使用通知ORDER BY,無論何時使用TOP,否則您將得到意想不到的結果。

SELECT TOP(1)[Status],StartTime,EndTime 
FROM (
     SELECT TOP(1) [Status],StartTime,EndTime,StartTime AS TEST 
     FROM dbo.MyTable 
     WHERE StartTime BETWEEN '08:00:00' AND '08:40:00' 
     ORDER BY StartTime DESC 
     UNION ALL 
     SELECT TOP(1) [Status],StartTime,EndTime,EndTime AS TEST 
     FROM dbo.MyTable 
     WHERE 
     EndTime BETWEEN '08:00:00' AND '08:40:00' 
     ORDER BY EndTime DESC 
) x 
ORDER BY TEST DESC 

如果「第一」的記錄只能由一個值來決定,例如開始時間,只是這樣做:

SELECT TOP(1) [Status],StartTime,EndTime 
FROM dbo.MyTable 
WHERE StartTime BETWEEN '08:00:00' AND '08:40:00' 
OR EndTime BETWEEN '08:00:00' AND '08:40:00' 
ORDER BY StartTime DESC 
2

這也許從來沒有真正發生,但只是要徹底的,我會還檢查範圍'08:00:00'和'08:40:00'完全落在開始時間和結束時間之間的衝突,例如開始時間= 7時30分00秒和結束時間= 09:00:00:

SELECT * 
FROM MyTable 
WHERE (
    StartTime BETWEEN '08:00:00' AND '08:40:00' 
    OR 
    EndTime BETWEEN '08:00:00' AND '08:40:00' 
    OR 
    '08:00:00' BETWEEN StartTime AND EndTime 
    OR 
    '08:40:00' BETWEEN StartTime AND EndTime 
)