数据:
这是样本表(TableA)数据
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 :(得分: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'