SQL计算日历年内的日期段

Bri*_*ian 7 sql date sql-server-2012

我需要的是在SQL中给出一个这样的表来计算日历年中的缺失时间段:

DatesTable
|ID|DateStart   |DateEnd   |
 1  NULL         NULL
 2  2015-1-1     2015-12-31
 3  2015-3-1     2015-12-31
 4  2015-1-1     2015-9-30
 5  2015-1-1     2015-3-31
 5  2015-6-1     2015-12-31
 6  2015-3-1     2015-6-30
 6  2015-7-1     2015-10-31
Run Code Online (Sandbox Code Playgroud)

预期回报将是:

 1  2015-1-1     2015-12-31
 3  2015-1-1     2015-2-28
 4  2015-10-1    2015-12-31
 5  2015-4-1     2015-5-31
 6  2015-1-1     2015-2-28
 6  2015-11-1    2015-12-31
Run Code Online (Sandbox Code Playgroud)

它本质上是工作块.我需要展示的是日历年没有奏效的部分.所以对于ID = 3,他从3/1工作到今年余下的时间.但他从1/1到2月28日没有工作.这就是我在寻找的东西.

Gor*_*off 0

如果您的数据不太大,这种方法就可行。它扩展所有日期和 id,然后将它们重新分组:

with d as (
      select cast('2015-01-01' as date)
      union all
      select dateadd(day, 1, d)
      from d
      where d < cast('2015-12-31' as date)
     ),
     td as (
      select *
      from d cross join
           (select distinct id from t) t
      where not exists (select 1
                        from t t2
                        where d.d between t2.startdate and t2.enddate
                       )
     )
select id, min(d) as startdate, max(d) as enddate
from (select td.*,
             dateadd(day, - row_number() over (partition by id order by d), d) as grp
      from td
     ) td
group by id, grp
order by id, grp;
Run Code Online (Sandbox Code Playgroud)

另一种方法依赖于累积总和和类似的功能,这些功能在 SQL Server 2012+ 中更容易表达。