2013-03-22 52 views
-1
SET TERMOUT ON 

DROP VIEW BP_VIEW; 
CREATE VIEW BP_VIEW AS 
SELECT b.BOOKINGID, 
     g.GUESTID, 
     g.FORENAME, g.SURNAME, 
     br.FLOORNO, br.ROOMNO, 
     r.TYPE, 
     b.TOTALPRICE + (rt.RATE*(b.DEPARTDATE - b.ARRIVEDATE)) AS TOTAL_AMOUNT_DUE 
FROM GUEST g, ROOM r 
INNER JOIN BOOKING b ON b.BOOKINGID = GUESTID 
INNER JOIN BOOKINGROOM br ON b.BOOKINGID = br.BOOKINGID AND r.FLOORNO = br.FLOORNO AND r.ROOMNO = br.ROOMNO 
INNER JOIN ROOMTYPE rt ON rt.TYPE = r.TYPE 
WHERE (CURRENT_DATE BETWEEN b.ARRIVEDATE AND b.DEPARTDATE); 

SELECT * FROM BP_VIEW; 

COMMIT; 

SET TERMOUT ON 

好傢伙日,比較在Oracle的sqlplus

我試圖執行上面的代碼,它執行罰款,但它是否選取更新某些預訂不落入B之間CURRENT_DATE的類別.ARRIVEDATE和b.DEPARTDATE。

有了這個聲明,我試圖找到最新的預訂信息,而不是過去的預訂。

執行代碼時,結果並非我所期望的。我是否正確地完成了該部分?

+1

什麼樣的數據類型'ARRIVEDATE'和'DEPARTDATE'? – 2013-03-22 11:53:59

+3

不知道它是否會解決,但'ROOM'和'ROOMTYPE'連接在一起,但不能連接到任何其他表。似乎你錯過了'BOOKINGROOM'和'ROOM'之間的連接。 – JWK 2013-03-22 11:54:18

+0

@JWK - 很好的結果。它顯示了編寫顯式連接而不是保持這種隱式連接語法要好得多。 – 2013-03-22 11:56:14

回答

0

Oracle的日期數據類型包含時間。這意味着:

where datefield between date1 and date2 

通常會錯過在date2上發生的記錄。這是更好的:

where datefield >= date1 
and datefield < date2 
0

我建議增加一個TRUNC()向兩側刪除日期時間部分,除非你想比較的日期和時間。此外,BETWEEN運營商可以使用和更可讀... T:

WHERE trunc(CURRENT_DATE) >= trunc(b.ARRIVEDATE) AND trunc(CURRENT_DATE) <= trunc(b.DEPARTDATE) 
+0

沒有區別,請參閱編輯。但現在它說沒有選擇行 – Hoody 2013-03-22 12:28:44

+0

@Mumin阿里 - 這很可能意味着你在這些日期之間沒有數據。添加示例數據,例如表,行......到你的文章。確保你的日期存在於你的表中 - 使其變得簡單,首先選擇一個包含日期的表格,以確保你有正確的數據和日期,然後添加其他表格......沒有辦法測試你的查詢/出樣本數據。 – Art 2013-03-22 12:35:01