Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查找给定开始日期和结束日期的重叠日期_Sql_Sql Server_Tsql_Date - Fatal编程技术网

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

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

给定MS SQL Server 2012中的一个数据集,其中旅行者以trip_ID作为UID进行旅行,并且每次旅行都有开始日期和结束日期,我希望找到旅行重叠的每个旅行者的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\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。