【问题标题】:SQL join against date ranges针对日期范围的 SQL 连接
【发布时间】:2021-12-28 17:29:09
【问题描述】:

我需要找出日期之间的差异。 表中的样本数据

CREATE TABLE #TEMP
(

StartDate DATE,
EndDate DATE
)

INSERT INTO #temp
VALUES
('12-01-2021','12-02-2021'),
('12-02-2021','12-03-2021'),
('12-03-2021','12-04-2021'),
('12-13-2021','12-14-2021'),
('12-14-2021','12-15-2021'),
('12-28-2021','12-29-2021')

需要输出:

StartDate EndDate
12-01-2021 12-04-2021
12-13-2021  12-15-2021
12-28-2021  12-29-2021

【问题讨论】:

  • 你有没有尝试过?
  • 什么是 dbms?

标签: sql join self gaps-and-islands


【解决方案1】:

您可以使用lag 来查找前一行的结束日期是使用datediff 的开始日期的行,然后为每一行保留此差异的运行总计。具有相同运行总数的行在同一组中,然后对于每个组,您可以分别获取开始日期和结束日期的最大值和最小值,以获得所需的输出。

如果你使用的是 sql server:

with u as 
(select StartDate,
EndDate,
case when
coalesce(datediff(day, lag(EndDate) over(order by StartDate, EndDate), StartDate), 0) = 0 then 0
else 1 end as change
from #TEMP),
v as
(select *, sum(change) over(order by StartDate, EndDate rows unbounded preceding) as g
from u)
select min(StartDate) as StartDate, max(EndDate) as EndDate from v group by g 

Fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多