两个集合不交叉,只要新插入的条记录的结束时间大于已存在的记录的开始时间并且新插入记录的最小值小于已存在记录的最大值,那么这两个时间段一定存在交叉。
总结起来就一句话:最小值小于最大值并且最大值大于最小值,则一定重叠。
所以,解决上述问题很简单,查询表,如果存在这样记录,表示待插入这条记录与表中已有记录在时间段上有重叠;如果不存在这样的记录,表示可以插入。这是插入,修改的需要排除待修改的这记录。
集合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
第一种
1 2 3 4 5 |
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) |
第二种
1 2 3 4 5 6 |
SELECT * FROM test_table WHERE NOT ( (end_time < a) OR (start_time > b) ) |