sql – INSERT语句中的“不是有效月份”

前端之家收集整理的这篇文章主要介绍了sql – INSERT语句中的“不是有效月份”前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个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'));

当我读到这种格式是正确的(如here所述),但oracle返回错误sql错误:ORA-01843:不是有效的月份.知道怎么解决这个问题吗?我使用的是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

但是,如果您的会话的默认日期语言是波兰语(从您的个人资料中猜测),则会出现此错误错误消息仍为英语:

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"

如果您不想将会话设置为英语,则可以通过给出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 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

这些方法也适用于日期列; the to_date() function以相同方式受NLS设置影响,并具有相同的可选日期语言参数.

原文链接:https://www.f2er.com/mssql/79300.html

猜你在找的MsSQL相关文章