首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遇到SQL错误: ORA-01843:无效月份

遇到SQL错误: ORA-01843:无效月份
EN

Stack Overflow用户
提问于 2016-04-14 07:57:07
回答 5查看 15.6K关注 0票数 3

我使用这个查询创建了一个表

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

我做错了什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
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')。

你可以:

代码语言:javascript
复制
INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TO_DATE( '04/04/2012 13:35', 'DD/MM/YYYY HH24:MI' );

(您不需要AM/PM,因为小时组件已经在24小时时钟上)

代码语言:javascript
复制
INSERT INTO STORE ( id, opening_time )
  VALUES( 1, TIMESTAMP '2012-04-04 13:35:00' );

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

票数 4
EN

Stack Overflow用户

发布于 2016-04-14 08:05:27

SQL错误: ORA-01843:无效月份

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

查看日期时间值,不需要使用时间戳,只需使用日期数据类型。它能保持到几秒钟的精度。

代码语言:javascript
复制
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独立的

代码语言:javascript
复制
DATE '2012-04-04' 

代码语言:javascript
复制
TIMESTAMP '2012-04-04 13:35:00'
票数 3
EN

Stack Overflow用户

发布于 2016-04-14 07:59:46

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

代码语言:javascript
复制
insert into Store values(to_date('04/04/2012 13:35 PM','DD/MM/YYYY HH:MI AM'));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36616974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档