我有一个租车脚本。我把汽车放在汽车桌上。我将所有预订信息保存在预订表中。预订表包含from和until日期字段以及car_id字段。
例如:car_id:14,from =“2014-06-24”,直到=“2014-07-24”。
我正在尝试编写一个查询来获取在给定日期之间不保留的所有汽车。我尝试了一些技巧,比如内连接而不存在等等。
所以,说我想在日期“2014-06-24”和“2014-08-24”之间获取可用的汽车。
为了简化目的以明确我的问题:使用此查询选择保留汽车不起作用:
SELECT * FROM reservation WHERE from >= '2014-06-24' AND until <= '2014-08-24'
因为汽车可能会从“2014-06-30”预订到“2014-09-15”。由于直到日期不大于或等于查询中的日期,因此汽车不会显示为保留。
我希望你能理解我的观点。提前谢谢。
由于Marc B的回答,我找到了我正在寻找的查询:
SELECT * FROM cars WHERE NOT EXISTS (
SELECT * FROM reservation WHERE cars.id = reservation.car_id AND until >= '2014-06-24' AND from <= '2014-08-24')
答案 0 :(得分:1)
考虑以下情况。你已经预订了你已经预约的日期A和B,以及你想要预订的两个日期,P和Q.这意味着以下条件可以成立:</ p>
A B P Q date comes AFTER 'already booked'
A P B Q * dates overlap
A P Q B * dates are entirely overlapped
P A Q B * dates overlap
P Q A B date comes BEFORE 'already booked'
*
的条目是您感兴趣的条目,一旦您将所有比较和逻辑缩小,您最终会得到
P <= B && Q >= A