所以我有点坚持这个我需要做的查询,我不知道它甚至意味着什么。
我需要能够从名为Vehicle_Details的表格中找到一个车辆编号,并检查它是否在当前正在使用的时间段我想用它来表示。
当安排新行程时,管理员必须找到一个尚未用于行程持续时间的车辆。由于经常需要此查询,因此可以轻松地为任意开始和结束日期运行它。因此,它应该使用替换变量,以便在运行时提供行程开始和结束日期。
确保在运行时,仅提示用户提供一次开始和结束日期。同时确保所显示的任何车辆在指定的整个期间内都可用 - 您必须在where子句中包含多个测试
任何代码都会有所帮助,但是甚至链接到可以帮助我自己写的东西,因为我不知道tbh。
Example data from the three tables:
Trip_ID Departure Return_Date Duration Registration
73180 07-FEB-12 08-FEB-12 1 PY09 XRH
73181 07-FEB-12 08-FEB-12 1 PY10 OPM
73182 07-FEB-12 10-FEB-12 3 PY56 BZT
73183 07-FEB-12 08-FEB-12 1 PY56 BZU
73184 07-FEB-12 09-FEB-12 2 PY58 UHF
Registration Make Model Year
4585 AW ALBION RIEVER 1963
SDU 567M ATKINSON N/A 1974
P525 CAO DAF FT85.400 1996
PY55 CGO DAF FTGCF85.430 2005
PY06 BYP DAF FTGCF85.430 2006
Weight Registration Body Vehicle ID
20321 4585 AW N/A 1
32520 SDU 567M N/A 2
40000 P525 CAO N/A 3
40000 PY55 CGO N/A 4
40000 PY06 BYP N/A 5
答案 0 :(得分:1)
您需要查找特定日期范围是否与任何预订相交。这是区间交叉算术。请考虑以下时间间隔[A,B]
和[x,y]
:
-----------[xxxxxxxxxxx]-------------
A B
---------------------[xxxxxx]--------
x y
当且仅当:
时,时间间隔[x,y]
将与[A,B]
相交
B >= x
A <= y
所以你的查询看起来像:
SELECT *
FROM registrations reg
WHERE reg.registration = :searched_vehicle
AND NOT EXISTS (SELECT NULL
FROM reservations res
WHERE res.registration = reg.registration
AND res.return_date >= :interval_start
AND res.departure <= :interval_end)
这是一辆车。如果查询返回一行,则此车辆在给定的时间间隔[:interval_start, :interval_end]
内可用。