2012-03-19 70 views
2

數據:
下面是示例表(表A)數據SQL查詢集

 
ID StartTime    EndTime 
1 2012-03-22 06:00:00.000  2012-03-22 06:30:00.000 
2 2012-03-22 06:15:00.000  2012-03-22 06:45:00.000 
3 2012-03-22 06:30:00.000  2012-03-22 07:00:00.000 
4 2012-03-22 06:45:00.000  2012-03-22 07:15:00.000 
5 2012-03-22 07:00:00.000  2012-03-22 07:30:00.000 
6 2012-03-22 07:15:00.000  2012-03-22 07:45:00.000 
8 2012-03-22 07:30:00.000  2012-03-22 08:00:00.000 
9 2012-03-22 07:45:00.000  2012-03-22 08:15:00.000 
10 2012-03-22 08:00:00.000  2012-03-22 08:30:00.000 
11 2012-03-22 08:15:00.000  2012-03-22 08:45:00.000 
12 2012-03-22 08:30:00.000  2012-03-22 09:00:00.000 
13 2012-03-22 08:45:00.000  2012-03-22 09:15:00.000 
14 2012-03-22 09:00:00.000  2012-03-22 09:30:00.000 
15 2012-03-22 09:15:00.000  2012-03-22 09:45:00.000 
16 2012-03-22 09:30:00.000  2012-03-22 10:00:00.000 

要求:
獲取一個給定的時間範圍內的連續的時間集。例如時間範圍:06:00至08:00

預期輸出:

 
ID StartTime    EndTime 
1 2012-03-22 06:00:00.000  2012-03-22 06:30:00.000 
3 2012-03-22 06:30:00.000  2012-03-22 07:00:00.000 
5 2012-03-22 07:00:00.000  2012-03-22 07:30:00.000 
8 2012-03-22 07:30:00.000  2012-03-22 08:00:00.000 

問:
是否有可能得到使用SQL查詢預期的輸出?我不想使用循環。

我想出了這個,但它只過濾第一個非連續的行。

SELECT * 
FROM TableA TableA_OUTER (nolock) 
WHERE CONVERT(VARCHAR(5),EndTime,114) <= CONVERT(VARCHAR(5),CAST('08:00' AS DATETIME),114) 
AND (CONVERT(VARCHAR(5),StartTime,114) = CONVERT(VARCHAR(5),CAST('06:00' AS DATETIME),114) OR EXISTS 
(SELECT NULL from TableA TableA_INNER (nolock) 
where CONVERT(VARCHAR(5),TableA_OUTER.StartTime,114) = CONVERT(VARCHAR(5),TableA_INNER.EndTime,114) 
)) 


非常感謝您的幫助!

+0

爲什麼不查詢返回記錄2,4和6? – GolfWolf 2012-03-19 21:37:31

+0

感謝您關注此事。 StarTime是第一張唱片選擇的關鍵,2開始時間是6:15。我的輸入是6:00。 – user1279484 2012-03-19 22:04:35

回答

0

試試這個

-- Create table 

CREATE TABLE [dbo].[TableA](
    [ID] [int] NULL, 
    [StartTime] [datetime] NULL, 
    [EndTime] [datetime] NULL 
) ON [PRIMARY] 

GO 

--insert sample data 
Insert Into TableA (ID,StartTime,EndTime) values(1 ,'2012-03-22 06:00:00.000',  '2012-03-22 06:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(2 ,'2012-03-22 06:15:00.000',  '2012-03-22 06:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(3 ,'2012-03-22 06:30:00.000',  '2012-03-22 07:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(4 ,'2012-03-22 06:45:00.000',  '2012-03-22 07:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(5 ,'2012-03-22 07:00:00.000',  '2012-03-22 07:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(6 ,'2012-03-22 07:15:00.000',  '2012-03-22 07:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(8 ,'2012-03-22 07:30:00.000',  '2012-03-22 08:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(9 ,'2012-03-22 07:45:00.000',  '2012-03-22 08:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(10 ,'2012-03-22 08:00:00.000',  '2012-03-22 08:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(11 ,'2012-03-22 08:15:00.000',  '2012-03-22 08:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(12 ,'2012-03-22 08:30:00.000',  '2012-03-22 09:00:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(13 ,'2012-03-22 08:45:00.000',  '2012-03-22 09:15:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(14 ,'2012-03-22 09:00:00.000',  '2012-03-22 09:30:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(15 ,'2012-03-22 09:15:00.000',  '2012-03-22 09:45:00.000') 
Insert Into TableA (ID,StartTime,EndTime) values(16 ,'2012-03-22 09:30:00.000',  '2012-03-22 10:00:00.000') 

--query 

Declare @AnchorElement int 
Set @AnchorElement = (Select top 1 ID from TableA 
where '2012-03-22 06:00:00.000' 
between StartTime and EndTime 
Order by StartTime 
) 
; 


With ListStartingAtDate (ID, StartTime, EndTime ,Level) as 
    (
     -- Anchor Timeframe definition 
     select ID, StartTime, EndTime , 0 as Level From TableA 
      --Where ID = @AnchorElement 
      -- StartTime has to be matched exactly 
      WHERE StartTime = '2012-03-22 06:00:00.000' 
     UNION ALL 
     -- Recursive Timeframe definition 
     select a.ID, a.StartTime, a.EndTime , Level +1 
     From TableA a 
     INNER JOIN ListStartingAtDate b 
     ON a.StartTime = b.EndTime 

    ) 

    select * from ListStartingAtDate 
    where StartTime >= '2012-03-22 06:00:00.000' and EndTime <= '2012-03-22 08:00:00.000' 
+0

@MalcomFrexner:謝謝你寫這篇文章,這肯定給出了我期待的正確輸入值的結果,當輸入開始時間或結束時間不在表格中時是否可以顯示沒有行?對於例如如果開始時間爲6:10,它仍然顯示從6:30開始的行。與endtime相同的問題。請告訴我。再次感謝。 – user1279484 2012-03-20 01:09:27

+0

我改變了查詢來匹配開始時間。我仍然需要考慮結束時間。可能只有一個不那麼優雅的solutiobn(如在結果表中查找結束日期) – 2012-03-20 08:14:30

+0

我認爲只有在endtime匹配時才運行查詢應該可以解決我的問題。 – user1279484 2012-03-20 12:53:16