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

基于SQL的车辆预订可用性校验方案咨询

修正车辆预订可用性校验的SQL查询

我看了你的问题和现有SQL查询,问题出在LEFT JOIN的条件逻辑搞反了,而且判断方式不够直观。咱们来一步步梳理并修正:

原查询的问题所在

你原来的LEFT JOIN条件里,把Status != 'Pending'和Status != 'Confirmed'作为连接筛选条件,这意味着只有已取消或非占用状态的记录才会被匹配到。当车辆实际存在待确认/已确认且日期重叠的预订时,反而不会匹配到任何记录,导致y.BookingID为NULL,CASE语句错误地返回1(标记为可用),完全违背了你的需求逻辑。

推荐的修正方案:使用EXISTS子查询(逻辑更清晰)

用EXISTS子查询直接检查是否存在符合占用条件的记录,这种写法更易读也更不容易出错:

SELECT CASE 
         WHEN EXISTS (
             SELECT 1 
             FROM tbl_bookings 
             WHERE VehicleID = '1009'
               AND Status IN ('Pending', 'Confirmed')
               -- 核心:判断预订区间与目标区间是否重叠
               AND FromDate <= '2021-12-22' 
               AND ToDate > '2021-12-15'
         ) THEN '0' -- 存在有效预订,车辆不可用
         ELSE '1'   -- 无有效预订,车辆可预订
       END AS availability;

逻辑说明:

  • EXISTS子查询会快速检查是否存在满足以下条件的记录:
    1. 匹配指定的VehicleID
    2. 状态为Pending(待确认)或Confirmed(已确认)
    3. 预订的日期区间与目标取/还车日期有重叠(通用的区间重叠判断逻辑:预订取车日 ≤ 目标还车日,且预订还车日 > 目标取车日)
  • 如果存在这样的记录,返回0表示车辆不可用;否则返回1表示可预订。

基于原LEFT JOIN写法的修正

如果你更习惯用LEFT JOIN的方式,调整连接条件,只匹配那些有效占用的记录即可:

SELECT CASE 
         WHEN y.BookingID IS NOT NULL THEN '0' 
         ELSE '1' 
       END AS availability 
FROM (SELECT 1) x 
LEFT JOIN tbl_bookings y 
  ON y.VehicleID = '1009'
  AND y.Status IN ('Pending', 'Confirmed')
  AND y.FromDate <= '2021-12-22' 
  AND y.ToDate > '2021-12-15';

逻辑说明:

现在LEFT JOIN的条件只筛选状态为待确认/已确认且日期重叠的记录:

  • 如果存在这样的记录,y.BookingID不为NULL,返回0(不可用)
  • 如果没有匹配到任何有效记录,y.BookingID为NULL,返回1(可用)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 03:02:45