我使用这个查询创建了一个表
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。
我做错了什么?
发布于 2016-04-14 08:24:31
'04/04/2012 13:35 PM'不是日期-它是一个字符串。
当使用TO_DATE( string_value, format_mask )会话参数的值作为格式掩码(注意:这是一个会话参数,属于客户端;它不是全局设置)时,甲骨文将对非日期文本进行隐式DATE。如果非日期文字与这种格式匹配,那么它就会工作(如果没有,那么它就不能工作)--但是,如果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' );(使用ANSI/ISO时间戳文字,Oracle将其隐式转换为日期)
发布于 2016-04-14 08:05:27
SQL错误: ORA-01843:无效月份
'04/04/2012 13:35 PM'是一个字符串,而不是date。您应该始终使用TO_DATE显式地将字符串转换为日期。永远不要依赖隐式数据类型转换。您可能只是幸运地依赖于特定于语言环境的NLS设置。但是,如果NLS设置不同,它将无法工作。因此,始终使用TO_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日期/时间戳文字,它使用固定格式的,因此它是NLS独立的。
DATE '2012-04-04' 或
TIMESTAMP '2012-04-04 13:35:00'发布于 2016-04-14 07:59:46
您不必在表中插入主键值。它是自动生成的。并尝试使用TO_DATE函数提供日期格式,如下所示:
insert into Store values(to_date('04/04/2012 13:35 PM','DD/MM/YYYY HH:MI AM'));https://stackoverflow.com/questions/36616974
复制相似问题