Освен ако нямате тригер в таблицата, който задава колона с дата или време, което би дало някаква индикация в пълния стек от грешки, звучи като вашия 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"
Ако не искате да настроите сесията си на английски, можете да замените това за конкретно изявление, като дадете незадължителния трети параметър на 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 по същия начин и има същия опционален езиков параметър за дата.