0

これはおそらくそれほど複雑ではありませんが、Business Objects は、SQL Developer に対して型の使用方法が非常に厳密であるようです。問題の声明の一部は次のとおりです。

ship_date between '01' || '-' || w_current_ora_month || '-' || to_char(to_date(w_last_day, 'DD-MON-RR HH:MI:SS AM'), 'yy') and to_char(to_date(w_last_day, 'DD-MON-RR HH:MI:SS AM'))

w_current_ora_month VARCHAR2(3) は次の方法で入力されます。

SELECT to_char(sysdate,   'MON')
  INTO w_current_ora_month
  FROM dual;

w.last_day DATE は次の方法で入力されます。

SELECT trunc(LAST_DAY('01' || '-' || w_current_ora_month || '-' || to_char(w_year)))
    into w_last_day
    from dual

Business Objects からプルするときに Not Valid Month エラーが発生するのはなぜですか? ビジネスオブジェクトが型に対してかなり厳密であることはすでにわかっているので、ここで何か間違ったことをしているのだろうかと思っています。これらはすべて SQL 開発者では正常に機能しますが、Business Objects で使用するときに機能するようにするには、このステートメントを何度も微調整する必要がありました。

4

1 に答える 1

6

文字列から日付への暗黙的な変換に依存していますが、これは常に悪い考えです。

文字列に変換してから日付に戻す必要がある場合は、常にto_date日付マスクを使用してください。それ以外の場合は、セッション内で変更できる NLS 変数に依存しています (ほぼ確実に問題の原因です)。

ただし、この場合、その必要はありません。あなたの状態は次のように単純化できます。

ship_date between trunc(sysdate,'MON') and last_day(trunc(sysdate))

@APC が指摘したように、フィールドに時間コンポーネントが含まれている場合、その月の最後の日の終わりまですべてを取得する必要があります。これは、いくつかの方法で実現できます。

ship_date between trunc(sysdate,'MON') 
              and last_day(trunc(sysdate))+(86399/86400)

ship_date between trunc(sysdate,'MON') 
              and add_months(trunc(sysdate,'MON'),1)-(1/86400)

ship_date >= trunc(sysdate,'MON') 
    and ship_date < add_months(trunc(sysdate,'MON'),1)

フィールドを将来的に変更することにした場合でも引き続き機能するため、私は最後のバージョンを好む傾向がありますTIMESTAMP

于 2010-07-22T20:41:26.907 に答える