我有一个名为Bookings的表,其中包含以下列:
RoomId (int)
ArrivalDate (datetime)
DepartureDate (datetime)我遇到的问题是检查已经创建的预订。下面是一些例子。
预订1 -1晚
ArrivalDate = 17/09/2018
DepartureDate = 18/09/2018
预订2 -2晚
ArrivalDate = 18/09/2018
DepartureDate = 20/09/2018
预订3 -4晚
ArrivalDate = 21/09/2018
DepartureDate = 25/09/2018
这就使得2018年9月20日到2018年9月21日的一晚预订就可以使用了。
我的奋斗之处是找到正确的查询来对抗以下情况。
预订4 -3晚
ArrivalDate = 20/09/2018
DepartureDate = 23/09/2018
这将失败,因为预订3已经采取了21/09/2018年和22/09/2018年。
预订5 -7晚
ArrivalDate = 20/09/2018
DepartureDate = 27/09/2018
这将失败,因为预订3已经采取了21/09/2018,22/09/2018,23/09/2018和24/09/2018年。但是,2018年9月25日和2018年9月26日
我已经编写了一个函数,尽管它目前正在失败,以检查是否可以预订。
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')我一整天都在做这件事,一直没能弄清楚。任何指向正确方向的指示都将不胜感激。
发布于 2018-09-20 20:02:36
此查询将查找与指定到达日期和出发日期重叠的预订。它假定出发日期是排他性的(即客人可以在前一位客人离开的当天到达):
SELECT *
FROM Bookings
WHERE RoomId = 1 AND @DepartureDate > ArrivalDate AND DepartureDate > @ArrivalDate
-- @Arrival/Departure dates are the ones you want to check有了这个查询,找到可用的房间就很简单了。
发布于 2018-09-20 19:41:35
如果您同时需要其他预订:
Select b.*
From Bookings
Where RoomId = 1 And
ArrivalDate <= '2018-09-21' and
DepartureDate >= '2018-09-20';逻辑很简单。两个周期重叠,如果一个开始于第二个结束或之前。第一个结束于第二个开始或之后。这假设期间包含终结点。如果<= (到<)和>= (到>)是排他性的,您可以调整它们。
如果没有返回记录,则这段时间(2018-09-20 - 2018-09-21)可以免费进行新的预订。
https://stackoverflow.com/questions/52431949
复制相似问题