汽车预订系统MySQL指定日期可用车辆查询SQL语句开发求助
解决汽车预订系统的日期范围可用车辆查询问题
我之前做过类似的汽车预订系统,这个日期重叠的判断确实容易绕晕,不过其实有个非常简洁的方法可以覆盖所有重叠场景,不用分开写四种情况~
核心逻辑:判断两个日期范围是否重叠
你提到的4种预订与目标日期的重叠场景,其实可以用一个统一的条件来覆盖:只要已有的预订时间段和目标时间段有任何交集,就说明该车辆在目标时段不可用。这个交集判断的条件是:
bookings.start_date < :target_end AND bookings.end_date > :target_start
咱们对应你说的4种情况验证下:
- 情况1:已预订范围完全包含目标范围 →
start_date ≤ target_start且end_date ≥ target_end→ 满足上述条件 - 情况2:已预订开始于目标内、结束于目标外 →
target_start ≤ start_date ≤ target_end且end_date ≥ target_end→ 满足条件 - 情况3:已预订开始于目标外、结束于目标内 →
start_date ≤ target_start且target_start ≤ end_date ≤ target_end→ 满足条件 - 情况4:已预订范围完全被目标包含 →
target_start ≤ start_date且end_date ≤ target_end→ 满足条件
只要不满足这个条件,就说明两个时间段完全不重叠,车辆可用。
完整SQL语句示例
假设我们有两张核心表:
vehicles:存储车辆基础信息,主键为vehicle_idbookings:存储预订记录,包含vehicle_id、start_date、end_date
要查询目标时段内可用的车辆,SQL可以这样写:
SELECT v.* FROM vehicles v WHERE NOT EXISTS ( SELECT 1 FROM bookings b WHERE b.vehicle_id = v.vehicle_id AND b.start_date < :target_end AND b.end_date > :target_start );
补充细节说明
- 参数适配:
:target_start和:target_end是你要查询的可用日期范围的起始/结束值,比如用户要订2024-05-10至2024-05-15,就传入这两个日期即可。 - 边界调整:当前条件是「开区间判断」——如果一个预订的
end_date刚好等于target_start,或者start_date刚好等于target_end,这两个时间段视为连续不重叠,车辆可用。如果你的业务要求这种情况也算不可用(比如用户预订到10号,另一个用户从10号开始订不能使用),可以把条件改成b.start_date <= :target_end AND b.end_date >= :target_start,根据业务需求灵活调整。 - 无独立车辆表的场景:如果你的系统暂时没有单独的
vehicles表,也可以通过分组统计bookings表的方式筛选可用车辆,不过更推荐用车辆表关联查询,能获取更完整的车辆信息。
内容的提问来源于stack exchange,提问作者ntan
相关产品推荐
相关产品推荐

