Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
T-SQL中的日期循环_Sql_Tsql_Window Functions - Fatal编程技术网

T-SQL中的日期循环

T-SQL中的日期循环,sql,tsql,window-functions,Sql,Tsql,Window Functions,我需要编写一个查询,显示不中断的时间间隔。 例如: 输入: create table calc(Id int, StartDate DATE, EndDate DATE); insert into calc values(1, '2019-01-01', '2019-01-02'); insert into calc values(2, '2019-01-02', '2019-01-03'); insert into calc values(3, '2019-01-03', '2019-01-0

我需要编写一个查询,显示不中断的时间间隔。 例如:

输入:

create table calc(Id int, StartDate DATE, EndDate DATE);
insert into calc values(1, '2019-01-01', '2019-01-02');
insert into calc values(2, '2019-01-02', '2019-01-03');
insert into calc values(3, '2019-01-03', '2019-01-04');
insert into calc values(4, '2019-01-14', '2019-01-15');
insert into calc values(5, '2019-01-16', '2019-01-17');
insert into calc values(6, '2019-01-17', '2019-01-18');
insert into calc values(7, '2019-01-25', '2019-01-26');
insert into calc values(8, '2019-02-03', '2019-02-04');
insert into calc values(9, '2019-02-04', '2019-02-05');
insert into calc values(10, '2019-03-01', '2019-03-02');
输出:

    StartDate , EndDate 
 '2019-01-01', '2019-01-04'
 '2019-01-14', '2019-01-15'
 '2019-01-16', '2019-01-18'
 '2019-01-25', '2019-01-26'
 '2019-02-03', '2019-02-05'
 '2019-03-01', '2019-03-02'
我认为我们需要逐行使用函数DATEDIFF。
问题是我不知道如何访问索引。或者这个问题能更容易地解决吗?

这是一种缺口和孤岛问题。使用滞后来查看相邻行是否重叠。对差距进行累计,然后进行汇总:

select min(startdate), max(enddate)
from (select c.*,
             sum(case when prev_ed = startdate then 0 else 1 end) over
                 (order by startdate) as grp
      from (select c.*,
                   lag(enddate) over (order by startdate) as prev_ed
            from calc c
           ) c
     ) c
group by grp
order by min(startdate);
是一个dbfiddle。

其他选项使用dateadd:

select min(startdate) as startdate, max(enddate) as enddate
from (select t.*, 
             sum(case when startdate <> prev_dt then 1 else 0 end) over (order by id) as grp
      from (select t.*,
                   dateadd(day, 1, lag(t.startdate) over (order by t.id)) as prev_dt
            from table t
           ) t
     ) t
group by grp
order by startdate;