我有一个场景,我有一个类似于下面的屏幕截图的 SQL 表。是否可以仅检索多个记录之间重叠部分的开始和结束日期?我已经查看了 StackOverflow 中的类似问题,我发现的是找到了重叠的记录,但没有找到实际的重叠范围。
所需的结果将显示开始日期为 1/1/2017,结束日期为 6/30/2017,因为该范围在两条记录中。
答案 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)
关键是要理解重叠的逻辑。
如果我们要搜索多行的重叠期,那么它总是从 MAX(startDate) 开始。
终点将是大于我们开始日期的结束日期中的最小值。
但我们需要考虑检查它们是否有重叠期。
所以代码应该是:
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;