判断时间是否有重叠


起因

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

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

解决方法

前提假设:

数据

开始时间 < 结束时间

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。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM