我使用此查询创建了一个表格
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
。
我做错了什么?
答案 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');
这适合我。