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日没有工作.这就是我在寻找的东西.
如果您的数据不太大,这种方法就可行。它扩展所有日期和 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+ 中更容易表达。
归档时间: |
|
查看次数: |
161 次 |
最近记录: |