Показать свободные номера между датами? SQL

Я надеюсь, что кто-то может помочь мне немного здесь ...

Я программирую небольшую программу бронирования для отеля, где я должен увидеть список доступных номеров между двумя заданными датами. У меня возникла проблема, заключающаяся в том, что если я выполню поиск с датой прибытия, которая позже даты прибытия в бронировании, номер все равно будет отображаться как доступный...

Мой вызов базы данных выглядит так:

String SQLString = "select roomnumber, roomtypeid from rooms "
        + "where roomnumber not in "
        + "(select roomnumber from booking "
        + "where arrival between to_date(?, 'yyyy-mm-dd') "
        + "and to_date(?, 'yyyy-mm-dd')) and roomtypeid = ? order by roomnumber";

Я пробовал разные комбинации строк sql, но ничего не помогает. Может ли кто-нибудь дать мне хороший намек?

CREATE TABLE BOOKING(
ARRIVAL             DATE ,
DEPARTURE           DATE,
RESERVATIONSNUMBER  INTEGER NOT NULL PRIMARY KEY,
ROOMNUMBER          INTEGER,
PAID                INTEGER,
CUSTOMERID INTEGER,
NUMBEROFGUESTS INTEGER,
CONSTRAINT BOFK FOREIGN KEY(ROOMNUMBER) REFERENCES ROOMS(ROOMNUMBER),
CONSTRAINT CUIDFK FOREIGN KEY(CUSTOMERID) REFERENCES CUSTOMER(CUSTOMERID));

person Englund0110    schedule 18.06.2014    source источник
comment
Не могли бы вы предоставить немного больше информации о вашей базе данных? Как определяется таблица бронирования?   -  person Icewind    schedule 18.06.2014
comment
Вы можете добавить простой SQL?   -  person Vinit Prajapati    schedule 18.06.2014
comment
Я добавлю sql для таблицы бронирования.   -  person Englund0110    schedule 18.06.2014
comment
Убедитесь, что вы передаете правильные даты в коде Java. Как только это будет проверено, проверьте результаты подзапроса — исключены ли нужные вам комнаты?   -  person    schedule 18.06.2014


Ответы (3)


Вот как искать перекрывающиеся бронирования. Вы можете заменить ‹= и >= на ‹ и >, если в тот же день это не считается проблемой.

select roomnumber, roomtypeid
from rooms 
where roomnumber not in 
(
  select roomnumber 
  from booking 
  where departure >= to_date(? /* desired arrival date */, 'yyyy-mm-dd')
  and arrival <= to_date(? /* desired departure date */, 'yyyy-mm-dd')
)
and roomtypeid = ? /* desired room type */
order by roomnumber;
person Thorsten Kettner    schedule 18.06.2014
comment
Вы даете список занятых комнат, когда ОП просил свободные (ок, это просто вопрос или логическое отрицание ...). Но вы решите проблему перекрытия - person Serge Ballesta; 18.06.2014
comment
Это помогло! Большое тебе спасибо! - person Englund0110; 18.06.2014

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

person Azar    schedule 18.06.2014

Это будет выглядеть примерно так -

SELECT *
FROM rooms r
WHERE NOT EXISTS (SELECT 1
                  FROM booking b
                  WHERE (?arrival_date_parameter BETWEEN arrival AND departure
                     OR arrival BETWEEN ?arrival_date_parameter AND ?departure_date_parameter)
                    AND r.roomnumber = b.roomnumber)
  AND roomtypeid = ?
ORDER BY roomnumber
person jva    schedule 18.06.2014
comment
Я попробую это. Но что такое r.roomnumber и b.roomnumber? - person Englund0110; 18.06.2014