我正在实施一个停车场预订系统,用户可在此预留停车位。
预订表
columns
--------------
parkingSpaceId
VehicleId
UserId
startDate
startTime
EndDate
EndTime
空间表
columns
--------
avialableSpaces
noOfBookings
用户可以使用参数startDate
,startTime
,EndDate
,EndTime
检查可用的停车位。
if avialableSpaces==noOfBookings
然后没有停车位。
在startDate,StartTime和EndDate,EndTime之间找出停车位是否可用的逻辑是什么?
答案 0 :(得分:0)
您可以通过询问不存在预定时间的parkingSpaceIds获取特定时间的可用停车场数量,其中您的给定时间开始或结束。
顺便说一句:你为什么要在桌子上分割日期和时间?我能想到的唯一原因是有一个没有另一个的可能性,例如:没有指定时间的一天(并且没有相关的默认时间)。如果是这种情况,您必须在上面的选择中考虑这一点。如果没有,你应该改变你的桌面设计。编辑:由于您的预订表有一个parkingSpaceId,我假设还有一个停车位表,每个停车位有一个记录。这是一个可能的陈述。它取决于dbms语句的外观。我在这里使用Oracle的AddTime函数来组合日期和时间以便于比较。如果必须使用单独的日期和时间字段并且如果其中一个可以为空 - 这将是分裂的唯一合理原因 - 那就更加复杂了。您必须相应地调整声明。
select parkingspaceid
from parkingspaces s
where not exists
(
select *
from reservations r
where r.parkingspaceid = s.id
and
(
(
addtime(:startdate,:starttime) >= addtime(r.startdate,r.starttime)
and
addtime(:startdate,:starttime) < addtime(r.enddate,r.endtime)
)
or
(
addtime(:enddate,:endtime) >= addtime(r.startdate,r.starttime)
and
addtime(:enddate,:endtime) < addtime(r.enddate,r.endtime)
)
)
);
答案 1 :(得分:-1)
select parkingspaceid
from parkingspaces s
where not exists
(
select *
from reservations r
where r.parkingspaceid = s.id
and
(
(
addtime(:startdate,:starttime) >= addtime(r.startdate,r.starttime)
and
addtime(:startdate,:starttime) < addtime(r.enddate,r.endtime)
)
or
(
addtime(:enddate,:endtime) >= addtime(r.startdate,r.starttime)
and
addtime(:enddate,:endtime) < addtime(r.enddate,r.endtime)
)
)
);