注:2024年4月9日大改
需求
先说明需求:在一天中我们可以申请使用会议室(那么他就有一个开始时间和结束时间),所以我们要先用条件查看一下有没有在我们想申请的时间段已经有人已经申请过使用会议室的记录了,如果查询出没有数据就证明这个时间段我可以申请使用会议室。
sql写法思路
我们先要总结一下一共会遇到几种情况。
为了方便理解,画图如下:
那么就会总共出现如下六种情况:
六种情况,其中允许的情况只有第一与第五种这两种情况。
其中还要考虑到开始时间是两个时间和结束时间是紧紧相邻的数据还是一样的时间数据。
那我们在写sql的时候就有两个角度来写:
一种是基于“反证法”的查询逻辑,另一种是一种更直接、简化的逻辑。
反证法查询逻辑
反证法的查询逻辑基于查找任何可能导致时间冲突的情况。
具体来说,这种方法试图找出所有不满足新预约时间段的已有预约。如果这样的查询没有返回任何结果,则意味着没有找到时间冲突,因此可以安全地创建新的预约。
SELECT * FROM 表名
WHERE NOT (
(end_time <= '新预约开始时间' AND start_time < '新预约开始时间')
OR
(start_time >= '新预约结束时间' AND end_time > '新预约结束时间')
)
如果这个查询返回空结果集,那么新的预约时间段就没有与现有预约重叠,因此是可接受的。这种方法的优点是它提供了一种保守的方式来避免时间冲突,但可能不如直接方法直观。
直接查询逻辑
相对于反证法,直接查询逻辑提供了一种更简洁、更易于理解的方法来检查时间冲突。这种方法直接查找与新预约时间段有重叠的已有预约。如果没有找到这样的预约,就意味着新的预约请求不会造成冲突。
这种方法的SQL示例如下:
SELECT * FROM 表名
WHERE '新预约开始时间' <= end_time AND '新预约结束时间' >= start_time
这个查询检查任何已有预约的结束时间是否晚于新预约的开始时间,并且检查已有预约的开始时间是否早于新预约的结束时间。如果查询返回空结果集,则没有找到与新预约时间段重叠的预约,因此新预约可以被安全地创建。
能不能留下一句“老铁666”