sql - 使用 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'
解决方案
使用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
返回1
fortrue
或0
for false
。
如果对于带有 id 的车辆,'1009'
表格中存在一行状态为已通过的还车日期'Pending'
或之前(或等于)'Confirmed'
且在(或等于)已通过的取车日期之后(或等于)的行,这意味着该车辆已被预订并且将return和 finally will return ,这将是车辆的可用性。FromDate
ToDate
EXISTS
1
NOT EXISTS
0
在这里,重要的是要比较FromDate
to:to_date
和ToDate
to:from_date
而不是相反,以便涵盖日期间隔的所有情况。
见演示。
推荐阅读
- mysql - LAMP Server @ AWS:我做对了吗?
- ruby-on-rails - 在保存失败引用之前在工厂机器人中有很多关联
- database - 我无法使用带有 Next.js 的 MongoDB 向我的文档添加新字段
- asp.net - 我想为我的视图模型使用分页列表。但由于它是一个模型列表,所以不支持它,请帮助我
- python - 从云端下载文件夹
- node.js - 在 electron-forge + webpack 应用程序中使用 electron-builder 构建的应用程序显示空白屏幕
- python - 将脚本转换为可执行文件后,出现此错误: MatplotlibDeprecationWarning
- ruby-on-rails - 设计:未经许可的参数::Devise::SessionsController 的名称
- python - 如何使用 SQLAlchemy 执行自引用相关子查询?
- json.net - 将 $ref 替换为特定类型的自定义属性