我有一张桌子,里面放了一堆书。客户可以在一天中的任何时间进行预约。我想确保不存在与新预订冲突的预订。
所以我想找到该日期的预订,并检查开始时间和结束时间是否重叠。我尝试使用子选择查询来获取当天的预订,然后查看这些时间是否重叠,但它似乎不起作用。
这是我正在使用的查询。(状态和活动是我需要的其他一些字段)。我找到相关日期,然后查看上午 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)
这是最好的使用方法吗?谢谢
要检查一个范围是否与另一个范围重叠,更容易首先考虑它何时不会重叠,然后反转条件。很明显:
如果 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)
通过这种方式,您可以处理所有极端情况,例如一个间隔完全包含另一个间隔。
| 归档时间: |
|
| 查看次数: |
2390 次 |
| 最近记录: |