建立"时间表"来自2个日期范围

时间:2017-02-14 01:30:58

标签: sql sql-server tsql date range

我一直绞尽脑汁但不能以有效的方式做到以下几点:

基本上我有3个日期范围如下:

ID |  StartDate |  EndDate
-----------------------------
1  | 1905-01-01 | 1910-01-01
2  | 1920-01-01 | 1990-01-01
3  | 2010-01-01 | 2020-01-01

预期结果是:

ID |  StartDate |  EndDate
-----------------------------
1  | 1900-01-01 | 1904-12-31
2  | 1905-01-01 | 1910-01-01
3  | 1910-01-02 | 1919-12-31
4  | 1920-01-01 | 1990-01-01
5  | 1990-01-02 | 2009-12-31
6  | 2010-01-01 | 2020-01-01
7  | 2020-01-02 | 9999-12-31

从一组给定的日期范围中,建立从最早可能日期到最晚可能日期的时间表。

我构建了一个查询,但效率非常低。它使用LEAD和LAG,但实际的结果集是" UNION ALL" -ed一次一个。此外,它不是动态的,它一次只能处理3个日期范围。我试图构建一个动态的,但每次尝试时,我最终都以同样的方式接近问题。任何帮助将不胜感激。

非常感谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您只需列出日期并使用lead()

select row_number() over (order by dte) as id,
       dte as startDate,
       coalesce(dateadd(day, -1, lead(dte) over (order by dte)), '9999-12-31') 
from ((select startDate as dte
       from t
      ) union all
      (select endDate as dte
       from t
      )
     ) t;