Pokud v tabulce nemáte spouštěč, který nastavuje sloupec s datem nebo časovým razítkem, který by poskytoval určitou indikaci v úplném zásobníku chyb, zní to jako váš NLS_DATE_LANGUAGE
neočekává anglickou zkratku měsíce.
To, co máte, platí v angličtině:
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
Pokud je však výchozím jazykem data vaší relace polština (hádám z vašeho profilu), zobrazí se tato chyba – chybová zpráva je stále v angličtině:
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"
Pokud svou relaci nechcete nastavit na angličtinu, můžete to u konkrétního příkazu přepsat zadáním volitelného třetího parametru do 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
Problému se také můžete zcela vyhnout použitím čísel měsíců místo názvů měsíců nebo použitím doslovné syntaxe časového razítka 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
Všechny tyto metody fungují také pro sloupce data; to_date()
funkce je ovlivněna nastavením NLS stejným způsobem a má stejný volitelný parametr jazyka data.