返回重叠日期范围的日期范围

时间:2021-05-26 20:44:15

标签: sql sql-server tsql

我有一个场景,我有一个类似于下面的屏幕截图的 SQL 表。是否可以仅检索多个记录之间重叠部分的开始和结束日期?我已经查看了 StackOverflow 中的类似问题,我发现的是找到了重叠的记录,但没有找到实际的重叠范围。

所需的结果将显示开始日期为 1/1/2017,结束日期为 6/30/2017,因为该范围在两条记录中。

enter image description here

2 个答案:

答案 0 :(得分:0)

让我们使用变量来保持简单。我假设您正在使用表中两行的一些连接,其中 ON 条件确定日期重叠。但是,由于您要问的部分是显示重叠日期,我们可以只使用变量:

DECLARE @start1 date = '20160701', @end1 date = '20170630'
       ,@start2 date = '20170101', @end2 date = '20171231'

SELECT CASE WHEN @start2 >= @start1 THEN @start2 ELSE @start1 END AS startdate
    ,  CASE WHEN @end2   <= @end1   THEN @end2   ELSE @end1   END AS enddate

如果您使用的是支持 GREATEST 和 LEAST 的 Azure SQL,则可以使用:

SELECT GREATEST(@start1, @start2) AS startdate
    ,  LEAST(@end1, @end2)        AS enddate

答案 1 :(得分:0)

关键是要理解重叠的逻辑。

  1. 如果我们要搜索多行的重叠期,那么它总是从 MAX(startDate) 开始。

  2. 终点将是大于我们开始日期的结束日期中的最小值。

但我们需要考虑检查它们是否有重叠期。

所以代码应该是:

declare @start datetime = (select MAX(PlanYearStart) start from @t);

if exists(select PlanYearEnd from @t where PlanYearEnd<@start)
begin
    select null OverlapStart, null OverlapEnd;
    return;
end;

select 
    @start OverlapStart,
    MIN(PlanYearEnd) OverlapEnd
from @t;