Хобрук: Ваш путь к мастерству в программировании

Найти бронирования, которые противоречат указанным датам прибытия/отъезда

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

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

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

Бронирование 1 - 1 ночь
Дата прибытия = 17.09.2018
Дата отъезда = 18.09.2018

Бронирование 2 - 2 ночи
Дата прибытия = 18.09.2018
Дата отъезда = 20.09.2018

Бронирование 3 – 4 ночи
Дата прибытия = 09 21 2018
Дата отъезда = 09 25 2018

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

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

Бронирование 4 — 3 ночи
Дата прибытия = 09 2018 г.
Дата отъезда = 09 23 2018 г.

Это не удастся, поскольку бронирование 3 уже занято 21 сентября 2018 г. и 22 сентября 2018 г.

Бронирование 5 – 7 ночей
Дата прибытия = 09 2018 г.
Дата отъезда = 09 27 2018 г.

Это не удастся, поскольку бронирование 3 уже занято на 21 9 июня 2018 года, 22 сентября 2018 года, 23 сентября 2018 года и 24 сентября 2018 года. Но 25 сентября 2018 г. и 26 сентября 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')

Я был в этом ВЕСЬ день и не смог понять это. Любые указатели в правильном направлении будут очень признательны.


  • Помогает ли вообще это? 20.09.2018
  • Какой запрос не работает? EF, SQL или оба? 20.09.2018

Ответы:


1

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

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

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

Учитывая этот запрос, найти свободные комнаты тривиально.

20.09.2018
  • Спасибо тебе за это. Это ПОЧТИ там с другим гаечным ключом в работах. Если у меня уже было бронирование 21 сентября 2018 г. на 1 ночь, НО я хотел обновить это бронирование и добавить к нему дополнительные даты, запрос, очевидно, возвращает результат. Как мне бороться с обновлением, чтобы сказать, что та же дата прибытия, но дата отъезда - 24.09.2018? 20.09.2018
  • Извините, я не понимаю. Вы хотите сказать, что система помечает бронирование как конфликтующее с собой? Затем просто добавьте Other.IDBooking <> ToUpdate.IDBooking. @Дейн 20.09.2018
  • Нет простите. Я сделал бронирование, назовем это Id=1. Но я хотел бы обновить это бронирование, чтобы добавить к нему дополнительные дни, вместо 1 ночи я хотел бы обновить его до 3 ночей. Но вместо того, чтобы создавать новое бронирование, я хотел бы обновить его, но все же проверить наличие мест на тот случай, если другие даты станут недоступны. @Салман А 20.09.2018
  • Вы по-прежнему будете использовать тот же запрос для проверки конфликтов перед обновлением: SELECT * FROM Bookings WHERE RoomId = 1 AND '24/09/2018' > ArrivalDate AND DepartureDate > '21/09/2018' AND Id <> 1. Обратите внимание, что я добавил Id <> 1, потому что бронирование всегда будет конфликтовать само с собой; вы хотите проверить только другие. 20.09.2018
  • Большое спасибо @Salman, работает удовольствие. Ваша помощь очень ценится. 21.09.2018

  • 2

    Если вы хотите, чтобы другие бронирования в то же время:

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

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

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

    20.09.2018
  • Гордон, что ты здесь показываешь? Этот запрос предположительно выведет Бронирование 3, предполагая, что он не может забронировать его на эту ночь, хотя на самом деле он может? 20.09.2018
  • @ДеррикМёллер. . . Это возвращает конфликты за заданный период времени. Если запрос не возвращает результатов, значит, конфликтов нет. 20.09.2018
  • Ваш запрос возвращает две записи, бронирование 2 и бронирование 3. Но диапазон дат с 20 по 21 сентября не должен иметь конфликтов? 20.09.2018
  • Это для включающих дат окончания, OP хочет эксклюзивных дат окончания, например. если кто-то уезжает 21 сентября, то этот день следует считать доступным. 20.09.2018
  • @ДеррикМёллер. . . Это предполагает, что конечные даты включены в период. Вам просто нужно настроить сравнения, если ваши правила немного отличаются. 21.09.2018
  • Новые материалы

    Понимание СТРУКТУРЫ ДАННЫХ И АЛГОРИТМА.
    Что такое структуры данных и алгоритмы? Термин «структура данных» используется для описания того, как данные хранятся, а алгоритм используется для описания того, как данные сжимаются. И данные, и..

    Как интегрировать модель машинного обучения на ios с помощью CoreMl
    С выпуском новых функций, таких как CoreML, которые упростили преобразование модели машинного обучения в модель coreML. Доступная модель машинного обучения, которую можно преобразовать в модель..

    Создание успешной организации по науке о данных
    "Рабочие часы" Создание успешной организации по науке о данных Как создать эффективную группу по анализу данных! Введение Это обзорная статья о том, как создать эффективную группу по..

    Технологии и проблемы будущей работы
    Изучение преимуществ и недостатков технологий в образовании В быстро меняющемся мире технологии являются решающим фактором в формировании будущего работы. Многие отрасли уже были..

    Игорь Минар из Google приедет на #ReactiveConf2017
    Мы рады сообщить еще одну замечательную новость: один из самых востребованных спикеров приезжает в Братиславу на ReactiveConf 2017 ! Возможно, нет двух других кланов разработчиков с более..

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..