-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

こんにちは。

上記のコードを実行しようとしていますが、正常に実行されますが、CURRENT_DATE BETWEEN b.ARRIVEDATE AND b.DEPARTDATE のカテゴリに該当しない特定の予約が更新されます。

このステートメントを使用して、過去の予約ではなく現在の予約情報を見つけようとしています。

コードの実行中、結果は期待したものではありません。AND SECTION を正しく実行しましたか?

4

2 に答える 2

0

Oracleの日付データ型には時刻が含まれます。つまり、これは次のことを意味します。

where datefield between date1 and date2

通常、date2に発生したレコードを見逃します。これの方が良い:

where datefield >= date1
and datefield < date2
于 2013-03-22T11:56:19.417 に答える
0

日付と時刻を比較したい場合を除き、両側に trunc() を追加して、日付から時刻部分を削除することをお勧めします。また、BETWEEN 演算子を使用して読みやすくすることもできます...T:

WHERE trunc(CURRENT_DATE) >= trunc(b.ARRIVEDATE) AND trunc(CURRENT_DATE) <= trunc(b.DEPARTDATE)
于 2013-03-22T12:24:53.567 に答える