Oracle特定时间戳格式'DD-MON-RR HH.MI.SSXFF AM'

Jos*_*sip 4 database oracle database-administration oracle11g nls-lang

我有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';
Run Code Online (Sandbox Code Playgroud)

我无法在SELECT语句中更改时间戳格式,需要保持原样.我想问题出在会话设置中.

在oracle数据库管理方面有经验的人可以提出建议,我会尝试.我知道有几个类似的帖子,但我找不到解决方案.谢谢

这是我的会话设置.

select * from nls_session_parameters;
Run Code Online (Sandbox Code Playgroud)

会话参数

nop*_*svk 5

核心问题是,在会话级别,您nls_numeric_characters=',.'的时间戳字符串包含dot(.)作为秒 - 从 - 微秒分隔符.

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> 
Run Code Online (Sandbox Code Playgroud)

请注意第三to_timestamp()个SELECT中函数的第三个参数.除了所有其他正确答案之外,这也是你能做的.