pep*_*uch 3 sql database oracle oracle11g
我有一个sql语句:
Insert into MYSCHEMA.TABLE1 (ID,MY_DATE) values (167600,to_timestamp('15-APR-14 01.36.58.803000000 PM','DD-MON-RR HH.MI.SS.FF AM'));
Run Code Online (Sandbox Code Playgroud)
当我读到这个格式是正确的(如描述在这里),但Oracle返回一个错误SQL Error: ORA-01843: not a valid month.知道如何解决这个问题吗?我使用的是Oracle Database 11b Express Edition.
除非您在表上设置了一个日期或时间戳列的触发器,这将在完整的错误堆栈中给出一些指示,否则听起来您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
Run Code Online (Sandbox Code Playgroud)
但是,如果您的会话的默认日期语言是波兰语(从您的个人资料中猜测),则会出现此错误 - 错误消息仍为英语:
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"
Run Code Online (Sandbox Code Playgroud)
如果您不想将会话设置为英语,则可以通过将可选的第三个参数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
Run Code Online (Sandbox Code Playgroud)
您还可以通过使用月份号而不是月份名或使用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
Run Code Online (Sandbox Code Playgroud)
这些方法也适用于日期列; 该to_date()功能以相同的方式受NLS设置的影响,并具有相同的可选日期语言参数.
| 归档时间: |
|
| 查看次数: |
7480 次 |
| 最近记录: |