遇到SQL错误:ORA-01843:不是有效月份

时间:2016-04-14 07:57:07

标签: sql oracle date-formatting

我使用此查询创建了一个表格 CREATE TABLE Store (id number(11) primary key not null, opening_time timestamp CHECK (EXTRACT(HOUR FROM opening_time) > 8 || NULL));

现在,当我尝试使用insert into Store values(1, '04/04/2012 13:35 PM');插入一些数据时,遇到此错误SQL Error: ORA-01843: not a valid month

我做错了什么?

5 个答案:

答案 0 :(得分:2)

  

SQL错误:ORA-01843:不是有效月份

'04/04/2012 13:35 PM'字符串,而不是日期。您应始终使用 TO_DATE 将字符串显式转换为日期。永远不要依赖隐式数据类型转换。您可能很幸运能够依赖特定于语言环境的NLS设置。但是,如果NLS设置不同,它将无法工作。因此,请始终使用 TO_DATE ,使用正确的格式掩码将文字转换为日期。

查看日期时间值,无需使用时间戳,只需使用 DATE 数据类型即可。它可以保持精确到几秒钟。

CREATE TABLE Store (id number(11) primary key not null, 
                    opening_time timestamp 
                    CHECK (EXTRACT(HOUR FROM opening_time) > 8 || NULL)); 

insert into Store 
values(1, TO_DATE('04/04/2012 13:35 PM', 'DD/MM/YYYY HH:MI', 'nls_date_language=ENGLISH'));

您还可以使用 ANSI date/timestamp literal 固定格式,因此 NLS独立

DATE '2012-04-04' 

TIMESTAMP '2012-04-04 13:35:00'

答案 1 :(得分:2)

'04/04/2012 13:35 PM'不是日期 - 它是一个字符串。

当使用TO_DATE( string_value, format_mask )会话参数的值作为格式掩码将Oracle插入DATE列时,Oracle将对非日期文字执行隐式NLS_DATE_FORMAT note :这是一个会话参数,属于客户端;它不是全局设置)。如果非日期文字匹配这种格式,那么它将起作用(如果它没有,那么它将不会) - 但是,如果NLS_DATE_FORMAT被更改,那么它将立即中断(任何一个巨大的痛苦调试,因为工作的代码不会,但没有人会更改代码。)

您可以通过查询找到当前的NLS_DATE_FORMAT

SELECT VALUE
FROM   NLS_SESSION_PARAMETERS
WHERE  PARAMETER = 'NLS_DATE_FORMAT';

最好使用正确的格式掩码明确使用TO_DATE()或使用ANSI / ISO日期文字(即DATE '2012-04-04'TIMESTAMP '2012-04-04 13:35')。

你可以这样做:

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );

(您不需要AM/PM,因为小时组件已经是24小时制)

INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );

(使用Oracle将隐式转换为日期的ANSI / ISO时间戳文字)

答案 2 :(得分:0)

您不必在表中插入主键值。它是自动生成的。并尝试使用TO_DATE函数提供日期格式,如:

insert into Store values(to_date('04/04/2012 13:35 PM','DD/MM/YYYY HH:MI AM'));

答案 3 :(得分:0)

良好的做法是使用to_date函数和您的数据格式。 在你的情况下,它将:

insert into Store 
values(1, to_date('04/04/2012 13:35', 'DD/MM/YYYY HH24:mi'));

您可以在official documentation中找到有关此功能的更多详细信息。

答案 4 :(得分:-1)

插入商店值(1,'04-APR-2012 13:35 PM');

这适合我。