Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 用于拾取连续时间集的SQL查询_Sql Server 2008 - Fatal编程技术网

Sql server 2008 用于拾取连续时间集的SQL查询

Sql server 2008 用于拾取连续时间集的SQL查询,sql-server-2008,Sql Server 2008,数据: 下面是示例表A数据 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

数据: 下面是示例表A数据

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 要求: 获取给定时间范围内的连续时间集。e、 g.时间范围: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查询获得预期的输出?我不想使用循环

我提出了这个,但它只过滤第一个非连续行

非常感谢你的帮助

试试这个

-- 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'
试试这个

-- 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'

为什么您的查询不应该返回记录2、4和6?感谢您的关注。开始时间是选择第一条记录的关键,因为2开始时间是6:15。我的输入是6:00。为什么您的查询不应该返回记录2、4和6?感谢您的关注。开始时间是选择第一条记录的关键,因为2开始时间是6:15。我的输入是6:00。@MalcomFrexner:谢谢你写这篇文章,这肯定给出了我所期望的正确输入值的结果,当输入开始时间或结束时间不在表中时,是否可以不显示行?例如,如果starttime为6:10,它仍然显示从6:30开始的行。endtime也有同样的问题。请让我知道。再次感谢。我更改了查询以匹配开始时间。我还得考虑结束时间。可能只有一种不太优雅的解决方案,比如在结果表中查找EndDate。我认为只有在endtime匹配时运行查询才能解决我的问题。@MalcomFrexner:谢谢你写这篇文章,这肯定会给出我所期望的正确输入值的结果,当输入starttime或endtime不在表中时,是否可以不显示行?例如,如果starttime为6:10,它仍然显示从6:30开始的行。endtime也有同样的问题。请让我知道。再次感谢。我更改了查询以匹配开始时间。我还得考虑结束时间。可能只有一种不那么优雅的解决方案,比如在结果表中查找EndDate。我认为只有在匹配endtime时运行查询才能解决我的问题。