判断时间是否有重叠
起因
最近在做一个需求:判断时间输入时间段(开始时间、结束时间)是否跟数据库已有数据重叠。什么叫重叠呢?
根据常规的认知,以上四种情况都被认为是时间的重叠。
解决方法
前提假设:
数据
开始时间 < 结束时间
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。