Найти заказы, которые противоречат данным датам прибытия / отъезда - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть таблица с именем Заказы , которая содержит следующие столбцы: -

RoomId (int)
ArrivalDate (datetime)
DepartureDate (datetime)

У меня проблема с проверкой уже созданных заказов.Примеры ниже.

Бронирование 1 - 1 Ночь
ArrivalDate = 17/09/2018
DepartureDate = 18/09/2018

Бронирование2 - 2 ночи
Дата прибытия = 18/09/2018
Дата вылета = 20/09/2018

Бронирование 3 - 4 ночи
Дата прибытия = 21/ 09/2018
Дата отправления = 25/09/2018

Таким образом, остается возможность бронирования на 1 ночь с 20/09/2018 по 21/09/2018.

Моя борьба заключается в поиске правильного запроса для борьбы с приведенными ниже сценариями.

Бронирование 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.2008 уже заняты.Но 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 голосов
/ 20 сентября 2018

В этом запросе будут найдены бронирования, которые перекрывают указанную дату прибытия и отъезда.Предполагается, что дата отъезда является исключительной (т. Е. Гость может прибыть в день отъезда предыдущего гостя):

SELECT *
FROM Bookings
WHERE RoomId = 1 AND @DepartureDate > ArrivalDate AND DepartureDate > @ArrivalDate
-- @Arrival/Departure dates are the ones you want to check

Все три теста здесь

С учетом этого запросанайти свободные номера тривиально.

0 голосов
/ 20 сентября 2018

Если вы хотите одновременно бронировать другие номера:

Select b.*
From Bookings
Where RoomId = 1 And 
      ArrivalDate <= '2018-09-21' and
      DepartureDate >= '2018-09-20';

Логика проста.Два периода перекрываются, если один начинается или до окончания второго.И первое заканчивается на или после второго запуска.Это предполагает, что периоды включают конечные точки.Вы можете настроить <= (до <) и >= (до >), если они являются эксклюзивными.

Если это не возвращает записей, то период (2018-09-20 -2018-09-21) бесплатно для нового бронирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...