2014-06-18 38 views
0

我希望有人可以在這裏給我一些幫助...顯示在日期間的可用客房? 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)); 
+0

你能否提供更多關於你的數據庫的信息?預訂表如何定義? – Icewind

+0

你可以添加純SQL嗎? –

+0

我將爲預訂表添加sql。 – Englund0110

回答

1

這裏是如何尋找重疊的預訂。如果同一天不被視爲問題,您可能需要更改< =和> =到<和>。

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; 
+0

當OP要求免費的時候,你給出了佔用房間的清單(好的,這只是一個問題或邏輯否定...)。但你** ** **解決過度問題 –

+0

這有幫助!非常感謝你! – Englund0110

0

我認爲唯一的問題是日期格式將所有日期字段轉換爲日期並檢查相同。

0

它會是這個樣子 -

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 
+0

我會試試這個。但是什麼是房間號碼和房間號碼? – Englund0110

+1

r和b是別名 – Genzotto