0

データベースのゲストが一定時間以上予約したすべての予約を計算しようとしています。到着日と出発日は予約表にあります。私は sqlplus で oracle を使用していますが、無効なエラーがdatediffポップアップを識別します。これが私の試みです。また、各予約の日付の違いを印刷物と一緒に表示できるようにしたいと考えています。

SELECT b.BOOKINGID, g.FORENAME, g.SURNAME 
FROM GUEST g, BOOKING b
WHERE g.GUESTID = b.GUESTID AND
DATEDIFF(day, b.DEPARTDATE, b.ARRIVEDATE) > 2;
4

2 に答える 2

4

Oracle に相当するものを試してください。

SELECT b.BOOKINGID, g.FORENAME, g.SURNAME 
FROM GUEST g join
      BOOKING b
      on g.GUESTID = b.GUESTID
where  (b.DEPARTDATE - b.ARRIVEDATE) > 2;

また、ANSI 結合構文を使用するようにクエリを変更しました。

注: これは、日付にタイム スタンプがないことを前提としています。もしそうなら、あなたは望むかもしれません:

where trunc(b.departdate) - trunc(b.arrivedate) > 2

泊数を取得します。

于 2013-03-21T13:50:19.823 に答える
2

ORACLEDATEDIFFには存在しません。しかし、Oracle では、2 つの日付の間に+または-オペランド
を直接使用できます。

したがって、あなたのリクエストは次のようになります:(選択に差分値を追加するために編集)

 SELECT b.BOOKINGID, g.FORENAME, g.SURNAME, 
 CASE WHEN (SYSDATE - b.DEPARTDATE) > 0 THEN CONCAT((SYSDATE - b.DEPARTDATE), ' days late')
 ELSE CONCAT((b.DEPARTDATE - SYSDATE),' days left')
 END AS "Booking Status"
 FROM GUEST g, BOOKING b
 WHERE g.GUESTID = b.GUESTID
 AND (SYSDATE - b.DEPARTDATE) > 2;

このクエリは、2 日以上遅れている予約のみを表示します。

編集

あなたが探していることを行うクエリは次のとおりです:(ゴードン・リノフが作成したものとほぼ同じです)

 SELECT b.BOOKINGID, g.FORENAME, g.SURNAME, (b.DEPARTDATE - b.ARRIVEDATE) as booking_duration
 FROM GUEST g, BOOKING b
 WHERE g.GUESTID = b.GUESTID
 AND (b.DEPARTDATE - b.ARRIVEDATE) > 2;
于 2013-03-21T13:50:06.997 に答える