选择不在日期之间的行(保留)
Posted
技术标签:
【中文标题】选择不在日期之间的行(保留)【英文标题】:Select rows that are not between dates (reservation) 【发布时间】:2014-08-14 01:23:12 【问题描述】:我有一个汽车租赁脚本。我有汽车在汽车表。我将所有预订信息保存在预订表中。预订表有 from 和 until 日期字段以及 car_id 字段。
例如:car_id: 14, from="2014-06-24", until="2014-07-24"。
我正在尝试编写一个查询来获取在给定日期之间未保留的所有汽车。我已经尝试了一些技巧,比如内部连接和不存在等。
所以,假设我正在尝试获取日期“2014-06-24”和“2014-08-24”之间的可用汽车。
为了简化问题以明确我的问题:使用此查询选择预留汽车不起作用:
SELECT * FROM reservation WHERE from >= '2014-06-24' AND until <= '2014-08-24'
因为可能会在“2014 年 6 月 30 日”到“2014 年 9 月 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')
【问题讨论】:
【参考方案1】:考虑以下情况。您已获得已预订的日期 A 和 B,以及您尝试预订的两个日期 P 和 Q。这意味着以下条件可能为真:
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
【讨论】:
以上是关于选择不在日期之间的行(保留)的主要内容,如果未能解决你的问题,请参考以下文章
删除重复行但保留最早的行(按日期标准) - SQL Server