我使用此查询创建了一个表现 CREATE TABLE Store (id number(11) primary key not null, opening_time timestamp CHECK (EXTRACT(HOUR FROM opening_time) > 8 || NULL));
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。
insert into Store values(1, '04/04/2012 13:35 PM');
SQL Error: ORA-01843: not a valid month
我做错了什么?
'04/04/2012 13:35 PM' 不是日期,而是一个字符串。
'04/04/2012 13:35 PM'
TO_DATE( string_value, format_mask )当DATE使用NLS_DATE_FORMATsession参数的值作为格式掩码将Oracle非日期文字插入到列中时,Oracle将对其进行隐式处理( 注意:这是一个session参数,属于客户端;它不是全局设置 )。如果非日期文字与该格式匹配,则它将起作用(如果不匹配,则它将不起作用)-但是,如果将NLS_DATE_FORMAT其更改,则它将立即中断(将其作为代码进行调试非常麻烦)该代码无法正常运行,但没有人会更改代码)。
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')。
TO_DATE()
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小时制上了)
AM/PM
或者
INSERT INTO STORE ( id, opening_time ) VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );
(使用Oracle将隐式转换为日期的ANSI / ISO时间戳文字)