SQL查找给定开始日期和结束日期的重叠日期
给定MS SQL Server 2012中的一个数据集,其中旅行者以trip_ID作为UID进行旅行,并且每次旅行都有开始日期和结束日期,我希望找到旅行重叠的每个旅行者的trip_ID以及重叠的范围。因此,如果初始表如下所示:SQL查找给定开始日期和结束日期的重叠日期,sql,sql-server,tsql,date,Sql,Sql Server,Tsql,Date,给定MS SQL Server 2012中的一个数据集,其中旅行者以trip_ID作为UID进行旅行,并且每次旅行都有开始日期和结束日期,我希望找到旅行重叠的每个旅行者的trip_ID以及重叠的范围。因此,如果初始表如下所示: | trip_ID | traveler | start_date | end_date | trip_length | |---------|----------|------------|------------|-------------| | AB24
| 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\u id、overlap\u start、overlap\u 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--|
我尝试了不同的方法来通知我的方法,但它没有返回正确的答案。我只是在寻找同一个旅行者的重叠,即在阿尔法或布拉沃,而不是阿尔法和布拉沃之间
对于overlap_id列,我认为代码必须测试旅行的开始日期加上range0,对于旅行者相同的任何其他旅行,trip_length返回的值是否在开始日期和结束日期之间的日期范围内,然后更新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)
您可以将表本身连接起来。连接条件如下所述: 选择t.*,o.行程ID,o.开始日期,o.结束日期 从t 在t.trip\u ID o.trip\u ID上左连接t作为o-trip始终重叠,因此排除它 和o.traveler=t.traveler-相同的traveler 和t.start\u date=o.start\u date
如果有两个重叠怎么办?好问题,现在让我们假设没有一个trip\u id会有超过1个重叠trip\u id。