1

RATEの5ヶ月前のを返品したいEFFECTIVE_DATEです。その日付が土曜日の場合、金曜日になるようにEFF_DATE1 日後ろに移動したいと思いEFFECTIVE_DATEます。これは私が使用しているコードですが、これまでのところ値を返しません:

DEFINE EFF_DATE = TO_DATE('05/31/2012','MM/DD/RRRR')
SELECT RATE, EFFECTIVE_DATE
FROM RATES_ALL
WHERE EFFECTIVE_DATE IN
  CASE 
    WHEN TO_CHAR(add_months(&&EFF_DATE, -5), 'DAY') = 'SATURDAY'
    THEN 
      (
        SELECT EFFECTIVE_DATE 
        FROM RATES_ALL 
        WHERE EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)-1
      )
    END;
4

4 に答える 4

0

RATES_ALL.EFFECTIVE_DATEの日付は日付だけですか、それとも時間もありますか?次のようなものが必要になる場合があります。

SELECT RATE, EFFECTIVE_DATE 
  FROM RATES_ALL 
 WHERE EFFECTIVE_DATE IN   
       CASE
         WHEN TRIM(TO_CHAR(add_months(&&EFF_DATE, -5), 'DAY')) = 'SATURDAY'
           THEN
            (
              SELECT MAX(EFFECTIVE_DATE)
                FROM RATES_ALL
               WHERE TRUNC(EFFECTIVE_DATE) = add_months(&&EFF_DATE, -5)-1
            ) 
       END; 

編集: さて、これがあなたのコードが機能しない理由です:

ドキュメントによると、DAY形式のモデルは「この要素に使用される日付言語で最も広い日の名前の幅を表示するために空白が埋め込まれた日の名前」です。したがって、TO_CHAR関数参照の出力は実際には「SATURDAY」です(最後のスペースに注意してください)。WHEN句でTO_CHAR関数の出力をTRIMする必要があります(編集されたクエリについては上記を参照してください)。

また、MAXなどのCASEステートメントで単一の行を返すには、SELECTに集計関数が必要です。

再テスト:

WITH rates_all AS
  (SELECT TO_DATE('05/31/2012','MM/DD/RRRR') effective_date, 1 rate from dual
   UNION
   SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 2 FROM dual
   UNION 
   SELECT TO_DATE('12/30/2011','MM/DD/RRRR'), 3 FROM dual)
SELECT RATE, EFFECTIVE_DATE
  FROM RATES_ALL
 WHERE EFFECTIVE_DATE IN
       CASE
         WHEN TRIM(TO_CHAR(add_months(TO_DATE('05/31/2012','MM/DD/RRRR') , -5), 'DAY')) = 'SATURDAY' THEN
           (SELECT MAX(EFFECTIVE_DATE)
              FROM RATES_ALL
             WHERE TRUNC(EFFECTIVE_DATE) = 
                   add_months(TO_DATE '05/31/2012','MM/DD/RRRR') , -5)-1)
         END;

      RATE EFFECTIVE_DATE
---------- --------------
         2 12/30/2011
         3 12/30/2011
于 2012-07-06T16:15:54.677 に答える
0

サブクエリに equals がある場合、正確に 5 か月前の日付の RATES_ALL に ROW がある場合にのみ一致します。

テーブルには常に 5 か月前の日付の行が含まれますか? 例(これがあなたが望むものかどうかはわかりませんが、これは少なくとも5か月前の最新/最新の行を返します):

    SELECT MAX(EFFECTIVE_DATE) 
    FROM RATES_ALL 
    WHERE EFFECTIVE_DATE <= add_months(&&EFF_DATE, -5)-1
于 2012-07-06T16:47:04.123 に答える
0

5 か月前と 5 か月前と 1 日前の両方のレコードを返す内部クエリを作成し、外部クエリで、その日が含まれる内部クエリから最大の結果を選択する方がはるかに簡単だと思います。土曜日です。

于 2012-07-06T16:24:17.560 に答える
0

Oracle についてはわかりませんが、土曜日をチェックする理由が RATES_ALL テーブルに土曜日のエントリがないためだと仮定すると、単純に次のようにしないのはなぜですか。

SELECT RA1.RATE, RA1.EFFECTIVE_DATE
FROM RATES_ALL RA1
WHERE RA1.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)
   OR (RA1.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5)-1
   AND NOT EXISTS(SELECT * FROM RATES_ALL RA2
                  WHERE RA2.EFFECTIVE_DATE = add_months(&&EFF_DATE, -5))
于 2012-07-06T17:17:00.930 に答える