问题描述
时间重叠指上下两行数据的时间段有重叠部分,现在要找出这些在时间上有重叠的记录。
具体问题
有7个会议室,每个会议室每天都有人开会,某一天的开会时间如下:
查询出开会时间有重叠的是哪几个会议室?上面预期结果是
ID
2
3
4
5
6
问题分析
为了方便分析,我们画了如下一个草图来具体描述。
图中上面部分t和下面部分b有一段是重复的,分别是b.starttime到t.endtime部分。通过数学集合的思想,我们可以得出这个重叠部分的集合关系。
t.starttime<=b.endtime
AND t.endtime>=b.starttime
上面这个数学集合的重叠部分就是我们要的找的。
具体解法
--创建测试数据 WITHMeetingAS( SELECT1ID,'08:00'Starttime,'09:15'Endtime UNIONALL SELECT2,'13:20','15:20' UNIONALL SELECT3,'10:00','14:00' UNIONALL SELECT4,'13:55','16:25' UNIONALL SELECT5,'14:00','17:45' UNIONALL SELECT6,'14:05','17:45' UNIONALL SELECT7,'18:05','19:45') --查询代码 SELECTDISTINCTb.*FROMMeetingt JOINMeetingbON t.Starttime<=b.Endtime ANDt.Endtime>=b.Starttime ANDb.ID<>t.ID--排除与自身时间相等的值
结果如下:
有兴趣的小伙伴可以动手做一下,兴许下次面试就遇到了。
转载请注明:IT运维空间 » 运维技术 » SQL中的时间重叠问题
发表评论