【问题标题】:Booking availability check using SQL使用 SQL 进行预订可用性检查
【发布时间】:2021-10-13 06:22:19
【问题描述】:

我有一个包含多条记录的 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'

【问题讨论】:

  • 样本数据、所需结果和适当的数据库标签都会有所帮助。

标签: sql date exists


【解决方案1】:

使用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 

EXISTStrue 返回10false

如果 ID 为 '1009' 的车辆在表中存在一行,其状态为 'Pending''Confirmed'FromDate 在(或等于)过去的下车日期之前 ToDate 在(或等于)过去的取车日期之后,这意味着车辆已预订,EXISTS 将返回1,最后返回@987654336 @ 将返回 0,这将是车辆的可用性。

在这里,将FromDate:to_dateToDate:from_date 进行比较很重要,而不是相反,以便涵盖日期间隔的所有情况。

请参阅demo

【讨论】:

  • 谢谢@forpas!您的查询似乎有效。您能否简要描述一下您的查询背后的逻辑。我有一张图片,因为 SQL 可读性很强。但我想确认一下。再次感谢您的时间和精力。
  • 太棒了。非常感谢@forpas。详细解答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 1970-01-01
相关资源
最近更新 更多