Найдите свободные комнаты на сегодня, используя mySQL - PullRequest
0 голосов
/ 27 сентября 2011

Если в mysql таблице RESERVATIONS есть RPOM_NUMBER, DATE_ARRIVAL и DATE_DEPARTED

Как мне найти все комнаты, которые доступны сегодня?

Ответы [ 6 ]

2 голосов
/ 27 сентября 2011

Проверка номеров, доступных в определенный момент времени:

select RPOM_NUMBER
from RESERVATIONS r
group by RPOM_NUMBER
having not exists (
    select *
    from RESERVATIONS 
    where
       RPOM_NUMBER = r.RPOM_NUMBER and
       now() between DATE_ARRIVAL and DATE_DEPARTED
)

Проверка номеров, доступных в данный период времени (от start_time до end_time):

select RPOM_NUMBER
from RESERVATIONS r
group by RPOM_NUMBER
having not exists (
    select *
    from RESERVATIONS 
    where
       RPOM_NUMBER = r.RPOM_NUMBER and
       {start_time} <= DATE_DEPARTED and
       {end_time} >= DATE_ARRIVAL
)
2 голосов
/ 27 сентября 2011
Select RPOM_NUMBER where current_date() not between DATE_ARRIVAL and DATE_DEPARTED;

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

1 голос
/ 27 сентября 2011

Вам нужна другая таблица, возможно, с именем rooms, которая содержит эту информацию. Строка в этой таблице может содержать столбцы типа room_number, is_occupied, is_reserved, reservation_start_time, reserved_for_how_long, reserved_by_whom. Материал, который относится только к комнате.

Поскольку у вас есть reservations (это может быть хорошей, полезной таблицей, кстати), вам трудно сказать, является ли комната пустой или занятой, отчасти потому, что нет столбца для действительно ли гость появился и занял комнату.

Вы можете также рассмотреть таблицу с именем guests, которая содержит всю информацию для каждого гостя.

1 голос
/ 27 сентября 2011
SELECT RPOM_NUMBER
FROM RESERVATIONS
WHERE (DATE(NOW()) NOT BETWEEN DATE_ARRIVAL AND DATE_DEPARTED)
1 голос
/ 27 сентября 2011
SELECT RPOM_NUMBER
FROM RESERVATIONS
WHERE (CURRENT_DATE() < DATE_ARRIVAL) OR (CURRENT_DATE() > DATE_DEPARTED)

РЕДАКТИРОВАТЬ: Ответ на комментарии относительно вставки в таблицу

Вы можете поместить запрос выше в подзапрос, а затем выполнить INSERT с INNER JOIN на возвращенный набором данных подзапроса.

! Не проверенный запрос ниже, просто чтобы показать идею:

INSERT INTO RESERVATIONS
SELECT available.RPOM_NUMBER, CURRENT_DATE(), CURRENT_DATE()
FROM RESERVATIONS r
INNER JOIN
 (SELECT RPOM_NUMBER
     FROM RESERVATIONS
     WHERE (CURRENT_DATE() < DATE_ARRIVAL) OR (CURRENT_DATE() > DATE_DEPARTED)
  ) available ON available.RPOM_NUMBER = r.RPOM_NUMBER
0 голосов
/ 27 сентября 2011

Вам действительно нужна таблица ROOMS, чтобы сделать эту базу данных удаленно удобной для работы - также с RPOM_NUMBER (который, как я предполагаю, определяет одну комнату).

Если у вас есть такая таблица, тогда этозапрос даст RPOM_NUMBERS бесплатно сейчас

SELECT RPOM_NUMBER FROM ROOMS WHERE RPOM_NUMBER NOT IN
(SELECT DISTINCT RPOM_NUMBER FROM RESERVATIONS WHERE 
 DATE_ARRIVAL < NOW() AND DATE_DEPARTED > NOW())

И это вставит строку в БРОНИРОВАНИЕ

INSERT INTO RESERVATIONS (RPOM_NUMBER,DATE_ARRIVAL,DATE_DEPARTED) VALUES
 (x, y, z)

(где x, y и z - RPOM_NUMBER, DATE_ARRIVAL И DATE_DEPARTED соответственно)

Это не учитывает конкретное время .Вам нужно будет подумать о том, когда вы хотите, чтобы комната была бесплатной. Если это 1 минута с момента отправления, это бесплатно?Или это очищается?

Это также предполагает, что при бронировании будет указана дата прибытия и отъезда. Как вы справляетесь с гостями, находящимися в открытом пребывании?

Этот SQL не тестировался и не уверен, будет ли он работать в MySQL - но он будет чем-то очень похожим.

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