Member 13597123 Ответов: 1

Как найти свободные номера между заданным диапазоном дат


привет,

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

У меня есть два стола, один из которых является хозяином комнаты, а другой-столом temp_booking.

Я хочу узнать у хозяина комнаты, какие комнаты свободны для данного диапазона дат. Номер содержится номер, категория номера и temmp_booking используется для бронирования, в котором содержится номер нет, book_from_date и book_to_date

Напр.:
Дата начала - 01/01/2018
дата окончания - 15.01.2018
категория номера - "люкс делюкс"
Всего номеров данной категории - 6 (ДС-1, ДС-2...... ДС-6)

Номер без категории book_from_date book_to_date
DS-1 Deluxe Suite 01/01/2018 01/15/2018
Ds-2 Deluxe Suite 01/04/2018 01/15/2018
Ds-3 Deluxe Suite 01/01/2018 01/10/2018

из приведенной выше таблицы я хочу отобразить Ds-2 и Ds-3, а также остальные номера DS-4, DS-5 и также 6, Когда я проверяю наличие свободных номеров с 01/01/2018 по 01/15/2018.

Потому что ДС-2 свободна от 01/01/2018 в 01/03/2018 и ДС-3 свободен от 01/11/2018 в 01/15/2018 и оставшиеся 3 номера имеют бронирование. Надеюсь, ты понял. Я хочу перечислить это в приоритетном порядке.

Что я уже пробовал:

SELECT r.Room_No
FROM       room_master AS r
WHERE room_catg = 'Deluxe Suite'
AND r.room_no NOT IN (SELECT t1.room_no
                          FROM Room_Master t1
                          INNER JOIN temp_booking t2 ON t1.room_no = t2.room_no
                           WHERE NOT (Book_To_Date < '01/01/2018') OR ([Book_To_Date] > '01/15/2018'))

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

OriginalGriff

Мы не можем: мы понятия не имеем, как выглядят ваши таблицы, какие данные они содержат, как они связаны. Мы понятия не имеем, что этот запрос производит, что отличается от того, что вы хотите.

Это не очень хороший вопрос - мы не можем понять из этого малого, что вы пытаетесь сделать.
Помните, что мы не можем видеть ваш экран, получить доступ к вашему жесткому диску или прочитать ваши мысли - мы получаем только то, что вы печатаете для работы.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

1 Ответов

Рейтинг:
11

Member 7870345

Привет:
С помощью схемы, которую вы даете для своей базы данных, невозможно получить результат, на который вы претендуете.
Проблема заключается в том, что вы хотите получить все номера при условии, что по крайней мере один день в диапазоне это отпуск, но нет таблицы, которая бы содержала все дни, существующие в диапазоне. Если ваш диапазон составляет 01/01/2018 - 01/15/2018, то его недостаточно, чтобы существовала/не существовала резервация в этом диапазоне, потому что возможно существование резервации с 01/04/2018 по 01/15/2018.

Я думаю, что если вы используете хранимую процедуру вместо Select stament, вы можете достичь своей цели.

Поэтому создайте хранимую процедуру, которая использует параметры fromDate, toDate и любые другие параметры для удовлетворения ваших требований (например, room_catg).
В этой процедуре создайте временный курсор, содержащий только один столбец room_no, чтобы содержать комнаты, которые его уверены, что содержат хотя бы один день отпуска (этот курсор пуст в начале).
Затем сделайте цикл while, чтобы "ходить" от fromDate к toDate, день за днем. Внутри этого цикла вы можете использовать запрос вашего примера (модифицированный для рассмотрения только диапазона только дня этого шага цикла). Это даст вам номера, которые являются отпуском в этот единственный день. Продолжайте вставлять это в темпоральный курсор.
Когда цикл заканчивается, в курсоре вы можете получить список комнат (вероятно, с дубликатами), которые, по крайней мере, имеют отпуск в дни, которые находятся между fromDate и toDate.


Я надеюсь, что это поможет вам