我有一条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'));
当我读到这个格式是正确的(如描述在这里),但Oracle返回一个错误SQL Error: ORA-01843: not a valid month。任何想法如何解决这个问题?我使用Oracle Database 11b Express Edition。
SQL Error: ORA-01843: not a valid month
除非您在表上设置了日期或时间戳记列的触发器(这会在完整的错误堆栈中提供一些指示),否则听起来您NLS_DATE_LANGUAGE不希望使用英语月份的缩写。
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()设置为来覆盖特定语句的会话:
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设置的影响相同,并且具有相同的可选日期语言参数。
to_date()