Формат отметки времени, специфичный для Oracle, "DD-MON-RR HH.MI.SSXFF AM"
У меня проблема с форматом отметки времени Oracle 11g.
Вот что у меня есть: select to_timestamp('21-OCT-15 08.24.30.000000000 PM','DD-MON-RR HH.MI.SSXFF AM') from dual;
Ответ из базы данных: ORA-01855: AM/A.M. or PM/P.M. required
01855. 00000 - "AM/A.M. or PM/P.M. required"
Я также попытался изменить настройки сеанса с помощью нескольких команд и до сих пор ничего.
alter session set NLS_LANGUAGE='ENGLISH';
alter session set NLS_DATE_LANGUAGE='ENGLISH';
alter session set NLS_TIMESTAMP_FORMAT = 'DD-MON-RR HH.MI.SSXFF AM';
alter session set NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RR HH.MI.SSXFF AM';
Я не могу изменить формат отметки времени в операторе SELECT, нужно остаться, как есть. Я думаю, что проблема в настройках сеанса.
Кто-то, имеющий опыт администрирования баз данных Oracle, может что-то подсказать, я постараюсь. Я знаю, что есть пара похожих постов, но я не нашел решения. Спасибо
Вот мои настройки сеанса.
select * from nls_session_parameters;
4 ответа
Основная проблема заключается в том, что на уровне сеанса у вас есть nls_numeric_characters=',.'
в то время как ваша строка метки содержит точку (.
) в качестве разделителя секунд от микросекунд.
to_timestamp()
Функция может принимать третий параметр для переопределения настроек NLS. Вот небольшая демонстрация для вас...
Connected to Oracle Database 12c Enterprise Edition Release 12.1.0.2.0
Connected as ******@******
--- This is how it behaves in your database (with "," as the decimals separator) ...
SQL> alter session set nls_numeric_characters = ',.';
Session altered
SQL> select to_timestamp('21-OCT-15 08.24.30.000000000 PM','DD-MON-RR HH.MI.SSXFF AM') as xx from dual;
select to_timestamp('21-OCT-15 08.24.30.000000000 PM','DD-MON-RR HH.MI.SSXFF AM') as xx from dual
ORA-01855: AM/A.M. or PM/P.M. required
--- This is how it behaves in my database (with "." as the decimals separator) ...
SQL> alter session set nls_numeric_characters = '. ';
Session altered
SQL> select to_timestamp('21-OCT-15 08.24.30.000000000 PM','DD-MON-RR HH.MI.SSXFF AM') as xx from dual;
XX
-------------------------------------------------
21.10.15 20:24:30.000000000
--- Now back to your database settings and let's make the conversion NLS-settings-indepenent ...
SQL> alter session set nls_numeric_characters = ',.';
Session altered
SQL> select to_timestamp('21-OCT-15 08.24.30.000000000 PM','DD-MON-RR HH.MI.SSXFF AM', 'nls_numeric_characters = ''. ''') as xx from dual;
XX
-------------------------------------------------
21.10.15 20:24:30,000000000
SQL>
Обратите внимание на третий параметр to_timestamp()
функция в третьем SELECT. Это то, что вы могли бы сделать, кроме всех других правильных ответов.
Сделайте резервную копию ваших настроек NLS и запустите их.
ALTER SESSION SET NLS_DATE_FORMAT='DD-MON-RRRR HH24:MI:SS';
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
ALTER SESSION SET NLS_TIME_FORMAT='HH.MI.SSXFF AM';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-RR HH.MI.SSXFF AM';
ALTER SESSION SET NLS_TIME_TZ_FORMAT='HH.MI.SSXFF AM TZR';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RRRR HH.MI.SSXFF AM TZR';
Затем снова запустите оператор SQL.
Наконец, я добавил Territory в предыдущий список, изменил свойства сессии, чтобы она работала для меня. Спасибо
ALTER SESSION SET NLS_TERRITORY=AMERICA;
ALTER SESSION SET NLS_DATE_LANGUAGE='AMERICAN';
ALTER SESSION SET NLS_TIME_FORMAT='HH.MI.SSXFF AM';
ALTER SESSION SET NLS_TIMESTAMP_FORMAT='DD-MON-RR HH.MI.SSXFF AM';
ALTER SESSION SET NLS_TIMESTAMP_TZ_FORMAT='DD-MON-RRRR HH.MI.SSXFF AM TZR';
ALTER SESSION SET NLS_TIME_TZ_FORMAT='HH.MI.SSXFF AM TZR';
Попробуй это: SELECT TO_CHAR(TO_TIMESTAMP(**'2015-11-21-13:03:07.04776'**),'DD-MON-RR HH.MI.SSXFF AM') FROM DUAL;
Формат отметки времени между кавычками должен совпадать с результатом этого запроса: SELECT TO_CHAR(LOCALTIMESTAMP) FROM DUAL