查找与给定的到达/离开日期冲突的预订

时间:2018-09-20 19:24:04

标签: c# sql entity-framework linq date

我有一个名为 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')

我整天都在忙,还没弄清楚。任何朝着正确方向的指针将不胜感激。

2 个答案:

答案 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

All of your three tests here

鉴于此查询,找到可用的房间很简单。