sql 判断某个时间段是否有重合

数据库 / 2020年10月21日 14时21分 / 5425人浏览
两个集合不交叉,只要新插入的条记录的结束时间大于已存在的记录的开始时间并且新插入记录的最小值小于已存在记录的最大值,那么这两个时间段一定存在交叉。 总结起来就一句话:最小值小于最大值并且最大值大于最小值,则一定重叠。 所以,解决上述问题很简单,查询表,如果存在这样记录,表示待插入这条记录与表中已有记录在时间段上有重叠;如果不存在这样的记录,表示可以插入。这是插入,修改的需要排除待修改的这记录。
集合1(第一个判断)  
    start___________end  
a___________b  

集合2(第二个判断)  
start________________end  
           a_________b  

集合3(第三个判断)  
start___________end  
            a______________b  

集合4  
        start___________end  
a_________________________b  
集合1并上(or)集合3实际上包含了集合4逻辑 
数据库的字段 start_time, end_time 输入的字段 a,b 第一种
SELECT * FROM test_table
WHERE
    (start_time >= a AND start_time <= b)
    OR (start_time <= a AND end_time >= b)
    OR (end_time >= a AND end_time <= b)
第二种
SELECT * FROM test_table
WHERE
    NOT (
        (end_time < a)
        OR (start_time > b)
    )