MySQL 判断两个时间或与其他时间段对比相互冲突||交集||重合的情况

判断一个时间段是否与其他时间段相互有交集

  • 需求
  • sql写法思路
  • sql

先说明一下,这个逻辑其实并不难,难点在于能否抽象化并快速理解我说的意思,能理解的话就很容易知道我在说什么也能快速找到关于时间对比的窍门。

需求

先说明需求:在一天中我们可以申请使用会议室(那么他就有一个开始时间和结束时间),所以我们要先用条件查看一下有没有在我们想申请的时间段有人已经申请过使用会议室的记录了,如果查询出没有数据就证明这个时间段我可以申请使用会议室。

sql写法思路

我们先要总结一下一共会遇到几种情况。
为了方便理解,
我把数据库中的已申请的开始时间和结束时间比作:00
把我们想申请的开始时间和结束时间比作:11
那么就会总共出现如下六种情况:
00 11(查不出数据)、
01 01(存在时间冲突)、
10 01(存在时间冲突)、
10 10(存在时间冲突)、
11 00(查不出数据)、
01 10(存在时间冲突)、
六种情况,其中允许的情况只有0011 || 1100这两种情况。
其中还要考虑到0和1的开始时间是两个时间和结束时间是紧紧相邻的数据还是一样的时间数据,这个我们后面会讲解。
那其实我们在写sql的时候只需要判定为剩下的这四种情况时就可以判定当前时间是否可行。

sql

修改时间:22-1-13
补全sql逻辑,之前的逻辑不够全面

WHERE (
	-- 0101
	( 
		DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) <= DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) > DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' ) 
		AND DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) < DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' ) 
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) <= DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' ) 
	) OR
	-- 0110
	( 
		DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) <= DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) > DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) < DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) >= DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' ) 
	) OR
	-- 1001
	( 
		DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) >= DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) > DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) < DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' ) 
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) <= DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' )
	) OR
	-- 1010
	( 
		DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) >= DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) < DATE_FORMAT( '开始时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.start_time, '%Y-%m-%d %H:%i:00' ) < DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' )
		AND DATE_FORMAT( mrs.finish_time, '%Y-%m-%d %H:%i:00' ) >= DATE_FORMAT( '结束时间', '%Y-%m-%d %H:%i:00' ) 
	)
)

补:
以上sql作如下解释:
我们需要将查询对比4次:
(查询开始时间和数据库开始时间)、(查询开始时间和数据库结束时间)
(查询结束时间和数据库开始时间)、(查询结束时间和数据库结束时间)
所以会出现个条件都会有四次对比
同时,等于号,是为了考虑了0和1时间相等的情况下
01相等的情况下,按照上面的四种出现条件情况,计算总共会出现如下几种时间相等的情况:

0101:0=1 0 1、0 1 0=1
0110:0=1 1 0 、0 1 0=1
1001:0=1 0 1、1 0 0=1
1010:0=1 1 0、1 0 0=1
0=1 0=1
不难发现,有重复的,那么也就是共计5种情况

所以,只要在sql逻辑中,将开始与开始时间加上=,结束和结束时间加上=进行条件判断即可
最后,这种逻辑sql其实并不难,只要有纸笔在纸上慢慢找规律还是很简单的。
能不能留下一句“老铁666”

你可能感兴趣的:(数据库相关,mysql,数据库,时间交集,时间冲突,时间)