我有一个名为 Bookings 的表,该表包含以下列:-
RoomId (int)
ArrivalDate (datetime)
DepartureDate (datetime)
我遇到的问题是检查已创建的预订。下面的示例。
预订1 -1晚
ArrivalDate = 17/09/2018
出发日期= 18/09/2018
预订2 -2晚
ArrivalDate = 18/09/2018
出发日期= 20/09/2018
预订3 -4晚
ArrivalDate = 21/09/2018
出发日期= 25/09/2018
因此,这使得从2018年9月20日到2018年9月21日的1晚预订可以预订。
我正在努力寻找正确的查询来应对以下情况。
预订4 -3晚
ArrivalDate = 20/09/2018
出发日期= 23/09/2018
这将失败,因为预订3已采用21/09/2018和22/09/2018。
预订5 -7晚
ArrivalDate = 20/09/2018
出发日期= 27/09/2018
这将失败,因为预订3已采用21/09 / 2018、22 / 09 / 2018、23 / 09/2018和24/09/2018。但是,有25/09/2018和26/09/2018可用
我编写了一个函数,尽管它当前无法运行,以检查是否可以进行预订。
var o = await dc.Bookings.Where(c =>
c.RoomId == roomId && c.IsDeleted == false &&
(c.ArrivalDate > arrivalDate && c.DepartureDate < departureDate)).CountAsync();
Select * From Bookings Where RoomId = 1 And
(ArrivalDate Between '2018-09-20 00:00:00.000' And '2018-09-21 00:00:00.000') Or
(DepartureDate Between '2018-09-20 00:00:00.000' And '2018-09-21 00:00:00.000') Or
(ArrivalDate >= '2018-09-20 00:00:00.000' And DepartureDate <= '2018-09-21 00:00:00.000')
我整天都在忙,还没弄清楚。任何朝着正确方向的指针将不胜感激。
答案 0 :(得分:1)
如果您要同时预订其他商品:
Select b.*
From Bookings
Where RoomId = 1 And
ArrivalDate <= '2018-09-21' and
DepartureDate >= '2018-09-20';
逻辑很简单。如果一个周期在第二个周期或之前开始,则两个周期重叠。并且,第一个结束于第二个开始或之后。假设这些时间段包括终点。如果它们互斥,则可以调整<=
(至<
)和>=
(至>
)。
如果此记录未返回任何记录,则可以免费使用新的预订期限(2018-09-20-2018-09-21)。
答案 1 :(得分:1)
此查询将查找与指定的到达和离开日期重叠的预订。假定出发日期是唯一的(即客人可以在前一位客人离开的当天到达):
SELECT *
FROM Bookings
WHERE RoomId = 1 AND @DepartureDate > ArrivalDate AND DepartureDate > @ArrivalDate
-- @Arrival/Departure dates are the ones you want to check
鉴于此查询,找到可用的房间很简单。