我需要检查MySQL以查看两个日期间隔是否相交.为了更好地解释我的问题:我有一个事件管理模块.如果我们有一个像这样添加的事件:
开始日期 :
'2013-09-09 08:00:00'结束日期 :
'2013-09-09 10:00:00'
现在我想添加另一个像这样的事件:
开始日期 :
'2013-09-09 09:00:00'结束日期 :
'2013-09-09 11:00:00'
或者像这样:
开始日期 :
'2013-09-09 07:00:00'结束日期 :
'2013-09-09 12:00:00'
我不应该这样做,因为在该时间间隔内已经添加了一个事件(08-10)
对于第一个例子(case A),我通过这样做解决了这个问题:
SELECT * FROM `events` as e
where
'2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end -- date start
OR
'2013-09-09 11:00:00' between e.ev_date_start and e.ev_date_end -- date end
Run Code Online (Sandbox Code Playgroud)
但对于第二种情况(case B),我很难搞清楚......
这个想法是检查它们是否不相交,然后求反。
NOT ('2013-09-09 08:00:00' >= e.ev_date_end OR e.ev_date_start >= '2013-09-09 11:00:00')
Run Code Online (Sandbox Code Playgroud)
这在逻辑上等价于
'2013-09-09 08:00:00' < e.ev_date_end AND e.ev_date_start < '2013-09-09 11:00:00'
Run Code Online (Sandbox Code Playgroud)
为了涵盖它们,您需要在 WHERE 子句中包含 4 个语句:
select *
from `events` as e
where '2013-09-09 07:00:00' between e.ev_date_start and e.ev_date_end
or '2013-09-09 12:00:00' between e.ev_date_start and e.ev_date_end
or e.ev_date_start between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'
or e.ev_date_end between '2013-09-09 07:00:00' and '2013-09-09 12:00:00'
Run Code Online (Sandbox Code Playgroud)
它可能看起来更简单,如下所示:
select *
from `events` as e
where @start between e.ev_date_start and e.ev_date_end
or @end between e.ev_date_start and e.ev_date_end
or e.ev_date_start between @start and @end
or e.ev_date_end between @start and @end
Run Code Online (Sandbox Code Playgroud)
仅测试已分配的时间块或要分配的时间块的开始时间不会相互之间.
select * from `events` as e
where '2013-09-09 08:00:00' between e.ev_date_start and e.ev_date_end
or e.ev_date_start between '2013-09-09 08:00:00'and '2013-09-09 11:00:00'
Run Code Online (Sandbox Code Playgroud)