【问题标题】:Date cycle in T-SQLT-SQL 中的日期循环
【发布时间】:2020-07-23 18:19:22
【问题描述】:

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

输入:

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。 问题是我不知道如何访问索引。或者这个问题能更容易解决吗?

【问题讨论】:

    标签: sql tsql window-functions


    【解决方案1】:

    这是一种孤岛问题。使用lag() 查看相邻行是否重叠。对gap进行累积求和,然后聚合:

    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);
    

    Here 是一个 dbfiddle。

    【讨论】:

      【解决方案2】:

      其他选项使用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;
      

      【讨论】:

        猜你喜欢
        • 2018-07-06
        • 2017-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        • 2015-05-19
        • 1970-01-01
        相关资源
        最近更新 更多