You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

汽车预订系统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_id
  • bookings:存储预订记录,包含 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
);

补充细节说明

  1. 参数适配::target_start 和 :target_end 是你要查询的可用日期范围的起始/结束值,比如用户要订2024-05-10至2024-05-15,就传入这两个日期即可。
  2. 边界调整:当前条件是「开区间判断」——如果一个预订的end_date刚好等于target_start,或者start_date刚好等于target_end,这两个时间段视为连续不重叠,车辆可用。如果你的业务要求这种情况也算不可用(比如用户预订到10号,另一个用户从10号开始订不能使用),可以把条件改成 b.start_date <= :target_end AND b.end_date >= :target_start,根据业务需求灵活调整。
  3. 无独立车辆表的场景:如果你的系统暂时没有单独的vehicles表,也可以通过分组统计bookings表的方式筛选可用车辆,不过更推荐用车辆表关联查询,能获取更完整的车辆信息。

内容的提问来源于stack exchange,提问作者ntan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:42:01