我有以下数据:
StartDate | EndDate
-------------------------
1982.03.02 | 1982.09.30
1982.10.01 | 1985.01.17
1985.06.26 | 1985.07.26
1985.07.30 | 1991.12.31
1992.01.01 | 1995.12.31
1996.01.01 | 2004.05.31
2004.06.05 | 2006.01.31
2006.02.01 | 2011.05.20
Run Code Online (Sandbox Code Playgroud)
我需要合并任何相邻的区间(开始日期和结束日期都包含在区间中,因此结束于2003.05.06的区间与2003.05.07开始的区间相邻),所以在这种情况下,结果集合应该:
StartDate | EndDate
-------------------------
1982.03.02 | 1985.01.17
1985.06.26 | 1985.07.26
1985.07.30 | 2004.05.31
2004.06.05 | 2011.05.20
Run Code Online (Sandbox Code Playgroud)
对我来说,显而易见的方法是使用游标迭代集合,并逐行构造结果集.但是,此功能将位于可能在一天内在重负载的服务器上被调用数千次的代码内,因此我不希望出现任何性能问题.任何数据集都很小(20行顶部),数据范围很大,因此任何生成范围内所有日期的解决方案都是不可行的.
有没有更好的方式我没有看到?
初始化代码(来自Damien的回答):
CREATE TABLE Periods (
StartDate datetime NOT NULL CONSTRAINT PK_Periods PRIMARY KEY CLUSTERED,
EndDate datetime NOT NULL
)
INSERT INTO Periods(StartDate,EndDate)
SELECT '19820302', '19820930'
UNION ALL SELECT '19821001', '19850117'
UNION ALL …Run Code Online (Sandbox Code Playgroud)