“不是有效月”上的INSERT语句 [英] "Not a valid month" on an INSERT statement
问题描述
我有一个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错误:ORA-01843:不是有效的月份
。任何想法如何解决这个问题?
As I read this format is correct (as described here) but oracle returns an error SQL Error: ORA-01843: not a valid month
. Any idea how to solve this problem? I use Oracle Database 11b Express Edition.
推荐答案
除非在设置日期或时间戳列的表上有触发器,这将给出一些指示在完整的错误堆栈,它听起来像你的 NLS_DATE_LANGUAGE
不期望英语月份的缩写。
Unless you have a trigger on the table that is setting a date or timestamp column, which would give some indication in the full error stack, it sounds like your NLS_DATE_LANGUAGE
is not expecting an English-language month abbreviation.
您拥有的英语有效性:
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
但是如果您的会话的默认日期语言是波兰语(从您的个人资料中猜出)给出此错误 - 错误消息仍然为英语:
But if your session's default date language is Polish (guessing from your profile) it will give this error - with the error message still in English:
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()
:
If you don't want to set your session to English you can override that for a specific statement by giving the optional third parameter to 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 时间戳文字语法:
You can also avoid the issue entirely by using month numbers instead of month names, or using the ANSI timestamp literal syntax:
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设置影响,并具有相同的可选日期语言参数。
These methods also all work for date columns; the to_date()
function is affected by NLS settings in the same way and has the same optional date language parameter.
这篇关于“不是有效月”上的INSERT语句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!