SQL 服务器 - 检查时间范围集是否相互重叠

SQL Server - check if sets of time ranges overlap each other

我有两个 table 具有时间范围、周和期间: 周数:

WeekID | StartDate  | EndDate    |
1      | 2017-01-01 | 2017-01-07 |
2      | 2017-01-08 | 2017-01-14 |
3      | 2017-01-15 | 2017-01-21 |

和时期:

PeriodID | StartDate  | EndDate    |
1        | 2016-12-01 | 2017-01-03 |
2        | 2017-01-20 | 2017-02-28 |
3        | 2017-03-15 | 2017-03-16 |

我只需要 table 周内的那些记录,这些记录有一些日期范围从周期 table 开始的共同日期。换句话说,我需要从 Weeks 中删除 StartDate 和 EndDate 之间的时间与期间 table 中的任何时间段没有任何共同日期的日期。有什么想法吗?

结果周数 table 应该是:

WeekID | StartDate  | EndDate    |
1      | 2017-01-01 | 2017-01-07 |
3      | 2017-01-15 | 2017-01-21 |

对此的任何想法都会有所帮助。

这将 return Weeks 不重叠 Period:

select *
from Weeks w
where not exists (
    select 1
    from Weeks l
      inner join Periods r
        on l.EndDate >= r.StartDate
       and r.EndDate >= l.StartDate
    where w.WeekId = l.WeekId 
  )

rextester 演示:http://rextester.com/VYTEC19325

returns:

+--------+------------+------------+
| WeekId | StartDate  |  EndDate   |
+--------+------------+------------+
|      2 | 2017-01-08 | 2017-01-14 |
+--------+------------+------------+

要删除 Weeks,请将 select * 更改为 delete

为了仅 select WeeksPeriods 重叠,将 not exists() 更改为 exists()