需要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
答案 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