Mysql 查询查看一个预订是否会与另一个预订冲突。

Kat*_*Kat 4 mysql select

我有一张桌子,里面放了一堆书。客户可以在一天中的任何时间进行预约。我想确保不存在与新预订冲突的预订。

所以我想找到该日期的预订,并检查开始时间和结束时间是否重叠。我尝试使用子选择查询来获取当天的预订,然后查看这些时间是否重叠,但它似乎不起作用。

这是我正在使用的查询。(状态和活动是我需要的其他一些字段)。我找到相关日期,然后查看上午 8 点是否位于这些结果的各个开始/结束时间之间,或者上午 9.40 是否也在开始/结束时间之间。

SELECT event_date, starttime, endtime, status, active 
FROM (SELECT event_date, starttime, endtime, status, active FROM bookings WHERE event_date='2013-07-21' AND status != 'cancelled' AND active !=0 LIMIT 1) AS q1
WHERE ('8:00:00' BETWEEN q1.starttime AND q1.endtime) AND ('9:40:00' BETWEEN q1.starttime AND q1.endtime)
Run Code Online (Sandbox Code Playgroud)

这是最好的使用方法吗?谢谢

Jon*_*oni 5

要检查一个范围是否与另一个范围重叠,更容易首先考虑它何时不会重叠,然后反转条件。很明显:

如果 A 在 B 结束之后开始,或者 A 在 B 开始之前结束,则两个范围 (A,B)不会重叠。

将其转换为 SQL,您将得到以下用于查找重叠范围的条件:

... WHERE NOT ('8:00:00' > q1.endtime OR '9:40:00' < q1.starttime)
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以将其重写为:

... WHERE q1.endtime > '8:00:00' AND q1.starttime < '9:40:00'
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以处理所有极端情况,例如一个间隔完全包含另一个间隔。