选择没有重叠时间SQL的每个项目

时间:2015-10-30 03:05:20

标签: sql overlap

Item    |   StartTime           |   EndTime
1       |   2015-08-15 03:00:00 |   2015-08-17 12:00:00
1       |   2015-08-15 07:00:00 |   2015-08-17 18:00:00
1       |   2015-08-18 03:00:00 |   2015-08-20 12:00:00
2       |   2015-08-15 03:00:00 |   2015-08-17 12:00:00
2       |   2015-08-15 07:00:00 |   2015-08-17 18:00:00
2       |   2015-08-19 04:00:00 |   2015-08-20 12:00:00

所以,如果我选择非重叠对象,结果应为:

1       |   2015-08-18 03:00:00 |   2015-08-20 12:00:00
2       |   2015-08-19 04:00:00 |   2015-08-20 12:00:00

1 个答案:

答案 0 :(得分:2)

解释

  • 首先尝试找到两个范围重叠T1.StartTime <= T2.EndTime ...
  • 的匹配项
  • 但必须是同一项T1.item = T2.item
  • 的范围
  • 并且必须是不同的范围T1.StartTime <> T2.StartTime and T1.EndTime <> T2.EndTime
  • 如果无法找到匹配意味着没有重叠T2.item IS NULL

<强> SqlFiddle Demo

 SELECT T1.*
 FROM YourTable T1
 LEFT JOIN YourTable T2
   ON (T1.StartTime <= T2.EndTime)  and  (T1.EndTime >= T2.StartTime)
  and T1.item = T2.item
  and T1.StartTime <> T2.StartTime
  and T1.EndTime <> T2.EndTime
 WHERE 
     T2.item IS NULL

<强>输出

| Item |                StartTime |                  EndTime |
|------|--------------------------|--------------------------|
|    1 | August, 18 2015 03:00:00 | August, 20 2015 12:00:00 |
|    2 | August, 19 2015 04:00:00 | August, 20 2015 12:00:00 |