判断时间是否有重叠

起因

最近在做一个需求:判断时间输入时间段(开始时间、结束时间)是否跟数据库已有数据重叠。什么叫重叠呢?

根据常规的认知,以上四种情况都被认为是时间的重叠。

解决方法

前提假设:

数据

开始时间 < 结束时间

php

待判断开始时间:$start_time

待判断结束时间:$end_time

mysql

表名:test

表开始时间字段:start_time

表结束时间字段:end_time

常规判断重叠方法(判断四种情况):

select count('x') from test where 
    (start_time < ‘$start_time’  && end_time > ‘$start_time’ && end_time < ‘$end_time’)  -- 情况一
    or (start_time > ‘$start_time’ && end_time < ‘$end_time’)  -- 情况二
    or (start_time > ‘$start_time’ && start_time < ‘$end_time’ && end_time < ‘$end_time’)  -- 情况三
    or (start_time < ‘$start_time’ && end_time > ‘$end_time’) -- 情况四

巧妙判断重叠方法(判断两种情况):

select count('x') from test where (start_time < ‘$end_time’) and (end_time > ‘$start_time’) 

结论

「巧妙判断重叠方法」是同事告诉我的,一开始我对这种判断方式是抗拒的,觉得明明需要四个条件判断才能实现的需求,怎么可能只通过两个条件实现呢,一定要找出一个反例。
后来我放弃了,这其实是数学问题,比如一个数大于10,那么它一定大于5。

posted @ 2021-07-09 15:53  luyuqiang  阅读(1143)  评论(0编辑  收藏  举报