3

У меня проблема с форматом timestamp Oracle 11g.Формат временной шкалы Oracle «DD-MON-RR HH.MI.SSXFF AM»

Это то, что у меня есть: 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'; 

Я не могу изменить формат timestamp в инструкции SELECT, необходимо оставаться таким, какой он есть. Я думаю, проблема в настройках сеанса.

Кто-то, кто имеет дело с администрированием базы данных оракула, может что-то предложить, попробую. Я знаю, что есть несколько подобных сообщений, но я не нашел решения. Спасибо

Вот мои настройки сеанса.

select * from nls_session_parameters; 

Session Parameters

+0

Возможно, проблема заключается в том, что вы используете период '.' в качестве разделителя для компонентов времени и как (по умолчанию) символ счисления. Работает ли он с «DD-MON-RR HH.MI.SSXFF9 AM''? 'NLS_LANGUAGE' устанавливает язык сообщений об ошибках, я предполагаю, что вы имеете в виду' NLS_DATE_LANGUAGE'. –

+0

@WernfriedDomscheit Я тоже попробовал изменить NLS_DATE_LANGUAGE и по-прежнему та же проблема. Также с вашим предложением изменение NLS_TIMESTAMP_FORMAT не работает. – Josip

+0

вы можете запустить 'select * from nls_session_parameters;' и вставить отформатированный результат в вопрос? Он отлично работает для меня в 12c. Как только вы дадите детали, мы сравним разницу. – Utsav

ответ

2

Сути проблема заключается в том, на уровне сеанса, вы должны 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. Это то, что вы могли бы сделать, кроме всех других правильных ответов.

1

Возьмите резервную копию настройки 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 снова.

-1

Попробуйте это: 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

-1

Наконец я добавил Территорию на предыдущий список измененных свойств сеанса, чтобы заставить его работать на меня. Благодаря

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'; 
Смежные вопросы