【发布时间】:2021-11-30 09:26:54
【问题描述】:
各位好心人!
我希望此查询检查两个日期之间是否有房间(朗姆酒,瑞典语)。但是,我希望查询首先检查房间是否已签出,否则使用 fDatum AND tDatum。如果房间已签出,则应使用 fDatum 和 checkUt。
在数据库中,我们存储了房间的预订时间(fDatum,tDatum),以及房间入住和退房的日期(checkIn,checkUt)。
编辑:输出将显示 2021 年 10 月 12 日至 2021 年 10 月 14 日期间未预订的房间的房间号,以及房间类型(单人房、双人房、家庭房)。
您将在下面找到当前正在使用的代码。但是,如果客人在 2021 年 10 月 12 日之前退房,如果房间被预订到 2021 年 10 月 12 日,房间可能仍会显示为已预订。 2021-10-12 房客仍需支付房费,但如果房客提前退房,酒店希望能够出租房间。
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (Select RumNr
From BokningRum
Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
GROUP BY rumNr
;
所以我希望代码像这样工作:
Select rumNr, rumTyp
From Rum
Where RumNr NOT IN (Select RumNr
From BokningRum
Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
OR checkUt BETWEEN '2021-10-12' AND '2021-10-14')
-- If checkUt is null, then do
-- Where fDatum BETWEEN '2021-10-12' AND '2021-10-14'
-- OR tDatum BETWEEN '2021-10-12' AND '2021-10-14')
GROUP BY rumNr
;
【问题讨论】:
-
嗨乔克,欢迎来到 Stack Overflow!如果您提供预期的输入和输出,我认为这将有助于其他人回答您的问题。
-
所以如果 checkIn 不为空,它是预订的开始日期,否则 fDatum 是?同样,如果 checkUt 不为 null,则为结束日期,否则 tDatum 为?
-
如果您正在寻找可在所有日期范围内使用的房间,则不能使用 between,因为如果在整个日期范围内预订,再加上开始和结束时的一些房间,则from 和 to 日期不在您的范围内。
-
另外,在某一天预订的房间不应该在当天入住吗?
-
@ysth 客气...我们并不真正关心此查询的入住日期,因为如果该人仅在一天后来,酒店不会放弃房间(但他仍然会为他错过的那一天付出代价)。所以 fDatum 是 fromDate,itDatum 是 toDate。这些是预订房间的日期,不能为空。 checkIn 和 checkUt(checkOut) 可以为空。因此,如果房间已签出并因此有日期,则应搜索 checkUt 以及 fDatum。如果房间在未来被预订,那么它不会有 checkIn/Ut 日期,因此它应该与 tDatum 一起搜索 fDatum。