时间段互斥算法SQL实现

背景

最近有接到需求,线上需要创建一个活动信息,同一时间段只能生效一个活动,活动状态需要自动流转。本文不针对全部需求进行设计,只讨论时间互斥的实现

实现思路

当前需要写入时间段S1----E1,场景模型建立:
表中的开始字段记为S,结束时间记为E,以下用区间标记列举存在场景:
case1: S<=S1<=E<=E1
case2: S1<=S<=E1<=E
case3: S<=S1<=E1<=E
case4: E1<S || E<S1
以上四种情况中,前三种都可以实现时间互斥,但是如果我们的判断条件去实现,会需要跑三次SQL才能实现,是否可以做一下精简,case4中为时间不互斥的场景,这个场景很明确,直接取反是否可行,case4取反得到的表达式即为:
case5: E1>=S && E<=S1
针对case5的场景,可以通过区间画图验证,是case1/2/3的交集,也即为我们需要的互斥判断条件,如果此区间查询到的数据是存在的,即我们当前设置的起始时间与表中已存在的时间段是互斥的。
select * from user where end_time <= ${startTime} and start_time <= ${endTime}

结果

问题分析后即可实现以一条SQL实现时间段互斥的判断,如果各位有更好的实现方案,欢迎留言讨论。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值