Jeśli nie masz wyzwalacza w tabeli, który ustawia kolumnę daty lub sygnatury czasowej, co dałoby pewną wskazówkę w pełnym stosie błędów, brzmi to tak, jakby Twój NLS_DATE_LANGUAGE
nie oczekuje skrótu w języku angielskim.
To, co masz, jest ważne w języku angielskim:
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
Ale jeśli domyślnym językiem daty sesji jest polski (zgadując z twojego profilu), wyświetli się ten błąd - z komunikatem błędu nadal w języku angielskim:
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"
Jeśli nie chcesz ustawiać swojej sesji na angielski, możesz to zmienić dla określonej instrukcji, podając opcjonalny trzeci parametr funkcji 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
Możesz również całkowicie uniknąć tego problemu, używając numerów miesięcy zamiast nazw miesięcy lub używając składni literału ANSI timestamp:
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
Wszystkie te metody działają również w przypadku kolumn dat; to_date()
na funkcję mają wpływ ustawienia NLS w ten sam sposób i ma ten sam opcjonalny parametr języka daty.