2

何か異常なことが起こっています。移行中に、2050 年を超える日付 (たとえば、20.05.2050、21.11、2051) がありますが、何らかの理由で、Oracle はそれらを 1950 年、1951 年などに変更します。これらは退職日なので、明らかに 1950 年代と 1960 年代になることはありません。

元のテーブルの日付は、YYYYMMDD 形式、別名 20500130 のようなものです。ここに私のマージ ステートメントを示します。

MERGE INTO employment_data emp                                                     
   USING   temp_02 src
   ON      (TO_NUMBER(src.id) = emp.id)
   WHEN MATCHED THEN UPDATE SET 
       emp.retirement_day = DECODE(TO_NUMBER(src.retirement), 0, NULL, TO_DATE(src.retirement, 'YYYY.MM.DD'));

他の日付 (例: 20301204) は問題ありませんが、2050 年以降の日付は問題になります。この煩わしさをどのように解決できますか?

事前にThx :-)

4

2 に答える 2

1

私はその方法を理解し、それが他の人を助けるかもしれないと考えました.

Oracle の設定の問題なのか、PL/SQL Developer のいたずらなのかはわかりません。いずれにせよ、最初に NLS_DATE_FORMAT を確認しました。

SELECT value FROM v$nls_parameters
WHERE parameter = 'NLS_DATE_FORMAT'

これは、DD-MON-RR に設定されていることを示しています。

構成を変更せずに、移行セッションとそのセッションのみの設定を変更したいと思います。

Alter SESSION SET nls_date_format = 'dd-mon-yyyy';

次に、merge ステートメントを実行します。

MERGE INTO employment_data emp                                                     
   USING   temp_02 src
   ON      (TO_NUMBER(src.id) = emp.id)
   WHEN MATCHED THEN UPDATE SET 
       emp.retirement_day = TO_CHAR(TO_DATE(src.retirement,'YYYY.MM.DD'));

そしてこれはうまくいきました。

于 2013-06-03T07:16:50.333 に答える