日付またはタイムスタンプの列を設定しているトリガーがテーブルにない限り、エラースタック全体に何らかの兆候が見られますが、NLS_DATE_LANGUAGE
のように聞こえます。 英語の月の省略形は期待していません。
あなたが持っているものは英語で有効です:
alter session set nls_timestamp_format = 'RR/MM/DD HH24:MI:SSXFF';
alter session set nls_date_language ='ENGLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;
MY_DATE
---------------------------
14/04/15 13:36:58.803000000
ただし、セッションのデフォルトの日付言語がポーランド語(プロファイルから推測)の場合、このエラーが発生します-エラーメッセージは英語のままです:
alter session set nls_date_language ='POLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM') as my_date
from dual;
SQL Error: ORA-01843: not a valid month
01843. 00000 - "not a valid month"
セッションを英語に設定したくない場合は、オプションの3番目のパラメーターをto_timestamp()
に指定することで、特定のステートメントのセッションをオーバーライドできます。 :
alter session set nls_date_language ='POLISH';
select to_timestamp('15-APR-14 01.36.58.803000000 PM',
'DD-MON-RR HH.MI.SS.FF AM',
'NLS_DATE_LANGUAGE=ENGLISH') as my_date
from dual;
MY_DATE
---------------------------
14/04/15 13:36:58.803000000
月名の代わりに月番号を使用するか、ANSIタイムスタンプリテラル構文を使用することで、この問題を完全に回避することもできます。
select timestamp '2014-04-15 13:36:58.803' from dual;
TIMESTAMP'2014-04-1513:36:58.803'
---------------------------------
14/04/15 13:36:58.803000000
これらのメソッドはすべて、日付列でも機能します。 to_date()
関数は同じようにNLS設定の影響を受け、同じオプションの日付言語パラメーターがあります。