我一直绞尽脑汁但不能以有效的方式做到以下几点:
基本上我有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个日期范围。我试图构建一个动态的,但每次尝试时,我最终都以同样的方式接近问题。任何帮助将不胜感激。
非常感谢。
答案 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;