2013-03-21 28 views
0

考慮上述關係。我試圖列出當前住在酒店的所有客人和家屬,這意味着他們出現在房間裏。SQL查詢輸出酒店中的當前客人

這裏是我的SQL查詢:

SELECT g.FORENAME, g.SURNAME   
    FROM GUEST g 
    INNER JOIN BOOKING b 
      ON g.GUESTID = b.GUESTID 
    WHERE (b.DEPARTDATE > TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY') AND b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY')) 
    UNION 
    SELECT d.FORENAME, d.SURNAME 
    FROM DEPENDANT d 
    INNER JOIN BOOKINGDEPENDANT bd 
      ON bd.DEPENDANTID = d.DEPENDANTID 
    WHERE bd.BOOKINGID IN (SELECT b.BOOKINGID 
          FROM BOOKING b 
          WHERE (b.DEPARTDATE > TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY') AND b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY'))); 

查詢執行,但顯示沒有行選擇,當它應該是。

這裏是我的插入語句預訂

INSERT INTO BOOKING VALUES (2002, 5445, '19-MAR-2013', '10-JUN-2013', 250.00); 

INSERT INTO BOOKING VALUES (2004, 3005, '19-MAR-2013', '21-MAR-2013', 250.00); 

儘管客人5445和3005與相關預訂滿足where條件,但沒有輸出顯示。林預計5445和3005

的名字,如果我刪除以下行:

b.ARRIVEDATE < TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY') 

將顯示名稱的列表。但邏輯錯誤,因爲如果沒有經過考慮,你無法檢測到目前的客人。

我的問題給你是上面的行不正確的添加?爲什麼他們在滿足條件時不顯示這些客人。畢竟他們是現在的客人。我能做什麼?

回答

4

我認爲問題在於比較字符串而不是日期。

'19-MAR-2013' < '21-MAR-2013' => TRUE 
'10-JUN-2013' > '21-MAR-2013' => FALSE (as '10...' < '21...') 

將您的日期保存在數據庫中作爲日期。 或者將它們轉換爲YYYY-MM-DD格式,如果您需要將它們作爲文本進行比較(這樣字符串比較將與日期比較匹配)

注意:雖然正確的解決方案是更改列數據日期,下面是該SQL將與文本列工作的一個修正版本(雖然遠不及有效/正確):

SELECT g.FORENAME, g.SURNAME   
FROM GUEST g 
INNER JOIN BOOKING b 
    ON g.GUESTID = b.GUESTID 
WHERE CURRENT_DATE BETWEEN TO_DATE(b.ARRIVEDATE, 'DD-MON-YYYY') AND TO_DATE(b.DEPARTDATE, 'DD-MON-YYYY') 

UNION 

SELECT d.FORENAME, d.SURNAME 
FROM DEPENDANT d 
INNER JOIN BOOKINGDEPENDANT bd 
    ON bd.DEPENDANTID = d.DEPENDANTID 
WHERE bd.BOOKINGID IN 
(
    SELECT b.BOOKINGID 
    FROM BOOKING b 
    WHERE CURRENT_DATE BETWEEN TO_DATE(b.ARRIVEDATE, 'DD-MON-YYYY') AND TO_DATE(b.DEPARTDATE, 'DD-MON-YYYY') 
); 
+0

PS又見http://stackoverflow.com/questions/10178292/comparison-date-in-oracle-sql關於此主題的更多信息 – JohnLBevan 2013-03-21 01:41:02

+0

@JohnBevan嗨John,我的列是在CREATE表語句中定義的日期在查詢中,我做了to_char查看其他討論人們如何使用它們。但誤解了這個概念。與TO_CHAR相反,我可以用什麼替換它們?或者您的答案超出了唯一的解決方案 – Hoody 2013-03-21 01:44:30

+0

Hey @MuminAli;如果您的列已經是日期,只需將它們與CURRENT_DATE進行比較 - 即已返回日期,因此無需將其轉換。即'BURRART_DATE和b.DEPARTDATE'之間的當前日期' – JohnLBevan 2013-03-21 01:47:07