Select每项无重叠时间SQL

Select each item without overlap time SQL

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

所以,如果我 select 个非重叠对象,结果应该是:

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

解释一下

  • 首先尝试找到两个范围重叠的匹配项 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 |