SQL查找给定开始日期和结束日期的重叠日期

时间:2019-11-26 13:23:42

标签: sql sql-server tsql date

鉴于MS SQL Server 2012中的一个数据集,其中旅行者出行(trip_ID为UID),并且每次旅行都有start_date和end_date,我希望找到每个旅行者的Trip_ID,其中旅行的重叠部分和范围重叠。因此,如果初始表如下所示:

| trip_ID | traveler | start_date | end_date   | trip_length |
|---------|----------|------------|------------|-------------|
|    AB24 |    Alpha | 2017-01-29 | 2017-01-31 |            2|
|    BA02 |    Alpha | 2017-01-31 | 2017-02-10 |           10| 
|    CB82 |  Charlie | 2017-02-20 | 2017-02-23 |            3|
|    CA29 |    Bravo | 2017-02-26 | 2017-02-28 |            2|
|    AB14 |  Charlie | 2017-03-06 | 2017-03-08 |            2|
|    DA45 |    Bravo | 2017-03-26 | 2017-03-29 |            3|
|    BA22 |    Bravo | 2017-03-29 | 2017-04-03 |            5|

我正在寻找一个查询,该查询会将三列附加到原始表中:overlap_id,overlap_start,overlap_end。这个想法是,每行都将有一个重叠行程的值(或NULL)以及重叠本身的开始和结束日期。像这样:

| trip_ID | traveler | start_date | end_date   |trip_length|overlap_id  |overlap_start| overlap_end| 
|---------|----------|------------|------------|-----------|------------|-------------|------------|
|    AB24 |    Alpha | 2017-01-29 | 2017-01-31 |          2|BA02--------|2017-01-31---|2017-01-31--|
|    BA02 |    Alpha | 2017-01-31 | 2017-02-10 |         10|AB24--------|2017-01-31---|2017-01-31--|
|    CB82 |  Charlie | 2017-02-20 | 2017-02-23 |          3|NULL--------|NULL---------|NULL--------|
|    CA29 |    Bravo | 2017-02-26 | 2017-02-28 |          2|NULL--------|NULL---------|NULL--------|
|    AB14 |  Charlie | 2017-03-06 | 2017-03-08 |          2|NULL--------|NULL---------|NULL--------|
|    DA45 |    Bravo | 2017-03-26 | 2017-03-29 |          3|BA22--------|2017-03-28---|2017-03-29--|
|    BA22 |    Bravo | 2017-03-28 | 2017-04-03 |          5|DA45--------|2017-03-28---|2017-03-29--|

我尝试使用Overlapping Dates in SQL的变体来告知我的方法,但未返回正确的答案。我只是在寻找同一位旅行者的重叠(即在Alpha或Bravo内部,而不是Alpha和Bravo之间)。

对于overlay_id列,我认为代码将必须测试行程的start_date加上range(0,trip_length)是否返回介于旅行者相同的任何其他行程的start_date和end_date之间的日期范围内的值,然后将trip_id更新为等于匹配行程的id。如果这是正确的概念,则我不确定如何从trip_length中获取一个变量,因此我将对其进行测试以测试其值的范围,即,对trip_length-x的所有值运行该值,直到trip_length-x = 0。 >

--This might be the bare bones of an answer
update table
set overlap_id = CASE 
WHEN ( DATEADD(day, trip_length, start_date) = SELECT (DATEADD(day, trip_length, start_date) from table where traveler = traveler) 

0 个答案:

没有答案