合并两个表中的间隔列表

时间:2018-08-27 10:25:17

标签: sql sql-server tsql

需要MS SQL查询以生成结果,如下所示:

TABLE 1包含每小时开始日期和结束日期的列表。另一个表TABLE 2包含停机时间开始日期和结束日期的列表。所需结果是RESULT表中显示的所有日期的列表。

表1

  StartTime                EndTime
2018-08-27 08:00:00  2018-08-27 09:00:00  
2018-08-27 09:00:00  2018-08-27 10:00:00  
2018-08-27 10:00:00  2018-08-27 11:00:00  
2018-08-27 11:00:00  2018-08-27 12:00:00  
2018-08-27 12:00:00  2018-08-27 13:00:00

表2

  StartTime               EndTime
2018-08-27 08:25:00  2018-08-27 08:30:00
2018-08-27 10:20:00  2018-08-27 10:30:00

结果

   StartTime                EndTime
2018-08-27 08:00:00  2018-08-27 08:25:00
2018-08-27 08:25:00  2018-08-27 08:30:00
2018-08-27 08:30:00  2018-08-27 09:00:00
2018-08-27 09:00:00  2018-08-27 10:00:00
2018-08-27 10:00:00  2018-08-27 10:20:00 --<< see changes
2018-08-27 10:20:00  2018-08-27 10:30:00 --<< period 10:00-11:00 got split
2018-08-27 10:30:00  2018-08-27 11:00:00 --<< as per 10:20-10:30 period from table2
2018-08-27 11:00:00  2018-08-27 12:00:00
2018-08-27 12:00:00  2018-08-27 13:00:00

1 个答案:

答案 0 :(得分:1)

我建议您合并所有开始时间和结束时间,然后使用INNER JOIN或LEAD(在较新版本的SQL Server中)基于时间间隔进行构建 See live demo

; with inputs  as
( select t=starttime from table1
 union 
 select t=endtime from table1
 union 
 select t=starttime from table2
 union
 select t=endtime from table2
 ),
  map as 
 (
     select starttime=t, endtime=lead(t) over ( order by t) 
     from inputs
  )

 select * from map 
 where endtime is not null
 order by starttime