MySQL 判断两个时间或与其他时间段对比相互冲突||交集||重合的情况

判断一个时间段是否与其他时间段相互有交集

注: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”

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

槐序二十四

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值