循环遍历上一个开始日期范围的日期范围

时间:2016-08-22 21:18:18

标签: sql-server

我有一系列日期(开始和结束日期)如下:

| StartDate  | EndDate    |  
| -----------| -----------|    
| 2016-09-03 | 2016-09-07 | 
| 2016-09-02 | 2016-09-08 |
| 2016-09-04 | 2016-09-06 |
| 2016-09-01 | 2016-09-06 |
| 2016-08-31 | 2016-09-02 |
| 2016-08-11 | 2016-08-14 |
| 2016-08-02 | 2016-08-03

我需要从日期范围开始,最大的EndDate横跨2016-09-05,这是一成不变的。在这种情况下,它是2016-09-02至2016-09-08。从这个日期范围开始,我使用StartDate作为我的新跨骑日期,即2016-09-02。我现在需要找到横跨2016-09-02的最大EndDate,应该是2016-09-01到2016-09-06。 StartDate再次成为我的新跨骑日期,即2016-09-01,因此还有一个日期范围跨越2016-08-31至2016-09-02。我的最后跨骑日期变为2016-08-31,因为没有更多的日期跨越这个日期。

这是一个简单的例子,可能包含更多日期,要么跨越前一个日期范围,要么根本不跨越,因此应该被忽略。

如何在SQL Server中执行此操作?可能吗?

1 个答案:

答案 0 :(得分:1)

create table #temp (dt1 date, dt2 date)
....
declare @dt_new date = '2016-09-05', @dt_old date

while (@dt_new is not null)

begin
    set @dt_old = @dt_new
    set @dt_new = null

    select top 1 @dt_new = dt1
    from #temp
    where dt1 < @dt_old and @dt_old < dt2
    order by dt2 desc
end

select @dt_old