今日、集中的な調査の結果、私たちの選択の一部が今日は機能しない理由は明らかです。このエラーは、キーワードinterval
とその既知の問題によって発生します。
質問:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '2' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '3' year as dt from dual;
ORA-01839: date not valid for month specified
01839. 00000 - "date not valid for month specified"
*Cause:
*Action:
select to_date('2012-feb-29','yyyy-mon-dd') + interval '4' year as dt from dual;
29-FEB-16 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' day as dt from dual;
01-MAR-12 00:00:00
select to_date('2012-feb-29','yyyy-mon-dd') + interval '1' month as dt from dual;
29-MAR-12 00:00:00
回答ここ
がoracle community blogからqouteである(またはそれは、ANSI/ISO specは、それが動作するはずと言うかのページ206ページ205 /トップの下です):
これは、インターバルの仕組みです。うるう年は 問題の中で最も少なくなります。 3月31日に1ヶ月追加すると、同じエラーが発生します。 の結果が有効なDATEであることを確認したい場合は、 ADD_MONTHSを使用してください。 (年を追加するための独立した機能はありません。今からn個の年であるDATEを取得するために ADD_MONTH(SYSDATE、12 * n)を使用します。)
それが私たちの場合に起こるのはなぜ
:
私たちのケースでは、セキュリティ上の理由から、いくつかのテーブルで仮想プライベートデータベースを使用しました。そしてそこでは、ほとんどの選択項目でinterval
キーワードを適用しました。
代わりに何をすべきか:代わりに
使用ADD_MONTHS
。
select add_months(to_date('2012-feb-29','yyyy-mon-dd'), 12) as dt from dual;
「table_date」列のデータ型は? –
@WernfriedDomを 'date'に設定する – Patrick
' select table_date from ... 'もそのエラーを受け取りますか?暗黙の変換に失敗した別の列かもしれませんか?テーブルまたはビュー(何かを計算する)ですか?またはそれは仮想列を持っていますか?エラーを受け取るセッション内のNLS_DATE_FORMATは何ですか?あなたは特定のクライアントでこれを見ていますか?SQL \ * Plusで再現できますか? –