首页 > 解决方案 > 使用 SQL 进行预订可用性检查

问题描述

我有一个包含多条记录的 SQL 表。用户将给出起始日期(上车)、下车日期(下车)和车辆 ID。

理想的查询是浏览记录并检查这些日期的特定 VehicleID 是否已预订。请注意,预订有状态。如果状态为“待定”或“已确认”,则应将其视为已预订/不可用。另一方面,如果状态为“已取消”或在给定日期没有该 VehicleID 的记录,则应将其视为免费/可预订。

我之前在查询没有太多参数时问过这个问题,但是在添加这些参数后我完全迷失了。

这是我的 sqlfiddle:http ://sqlfiddle.com/#!9/b794c1/2/0

这是似乎返回错误数据的查询:

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

标签: sqldateexists

解决方案


使用NOT EXISTS

SELECT NOT EXISTS (
         SELECT 1
         FROM tbl_bookings
         WHERE VehicleId = '1009'
           AND Status IN ('Pending', 'Confirmed')
           AND FromDate <= :to_date AND ToDate >= :from_date
       ) availability 

EXISTS返回1fortrue0for false

如果对于带有 id 的车辆,'1009'表格中存在一行状态为已通过的还车日期'Pending'或之前(或等于)'Confirmed'且在(或等于)已通过的取车日期之后或等于)的行,这意味着该车辆已被预订并且return和 finally will return ,这将是车辆的可用性。FromDate ToDateEXISTS1NOT EXISTS0

在这里,重要的是要比较FromDateto:to_dateToDateto:from_date而不是相反,以便涵盖日期间隔的所有情况。

演示


推荐阅读