2012-03-19 71 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