gpt4 book ai didi

sql - 在 SQL Server 中合并日期间隔

转载 作者:行者123 更新时间:2023-12-03 01:08:53 25 4
gpt4 key购买 nike

我有以下数据:

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

我需要合并任何相邻的时间间隔(开始日期和结束日期都包含在时间间隔中,因此 2003 年 5 月 06 日结束的时间间隔与 2003 年 5 月 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

对我来说,执行此操作的明显方法是使用游标迭代该集合,并逐行构造结果集。但是,此功能将位于一天内可能在重负载的服务器上被调用数千次的代码中,因此我不希望出现任何性能问题。任何数据集都很小(最多 20 行),并且数据范围很大,因此任何生成一个范围内的所有日期的解决方案都是不可行的。

有没有更好的方法我没有看到?

<小时/>

初始化代码(来自达米安的回答):

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 SELECT '19850626', '19850726'
UNION ALL SELECT '19850730', '19911231'
UNION ALL SELECT '19920101', '19951231'
UNION ALL SELECT '19960101', '20040531'
UNION ALL SELECT '20040605', '20060131'
UNION ALL SELECT '20060201', '20110520'

最佳答案

我设置示例数据比编写查询花费的时间更长 - 如果您发布包含 CREATE TABLEINSERT/SELECT 的问题会更好声明。我不知道你的表叫什么,我把我的表称为句点:

create table Periods (
StartDate date not null,
EndDate date not null
)
go
insert into Periods(StartDate,EndDate)
select '19820302','19820930' union all
select '19821001','19850117' union all
select '19850626','19850726' union all
select '19850730','19911231' union all
select '19920101','19951231' union all
select '19960101','20040531' union all
select '20040605','20060131' union all
select '20060201','20110520'
go
; with MergedPeriods as (
Select p1.StartDate, p1.EndDate
from
Periods p1
left join
Periods p2
on
p1.StartDate = DATEADD(day,1,p2.EndDate)
where
p2.StartDate is null
union all
select p1.StartDate,p2.EndDate
from
MergedPeriods p1
inner join
Periods p2
on
p1.EndDate = DATEADD(day,-1,p2.StartDate)
)
select StartDate,MAX(EndDate) as EndDate
from MergedPeriods group by StartDate

结果:

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

关于sql - 在 SQL Server 中合并日期间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6068619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com