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 Weeks
与 Periods
重叠,将 not exists()
更改为 exists()
。
我有两个 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 Weeks
与 Periods
重叠,将 not exists()
更改为 exists()
。