背景
最近有接到需求,线上需要创建一个活动信息,同一时间段只能生效一个活动,活动状态需要自动流转。本文不针对全部需求进行设计,只讨论时间互斥的实现
实现思路
当前需要写入时间段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实现时间段互斥的判断,如果各位有更好的实现方案,欢迎留言讨论。