sql - 遇到 SQL 错误 : ORA-01843: not a valid month

标签 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: 不是有效的月份

我做错了什么?

最佳答案

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

Oracle 将执行隐式 TO_DATE( string_value, format_mask )在将非日期文字插入 DATE 时使用 NLS_DATE_FORMAT 值的列 session 参数作为格式掩码(注意:这是一个 session 参数,属于客户端;它不是全局设置)。如果非日期文字与此格式匹配,那么它将起作用(如果不匹配,则不会起作用)- 但是,如果 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 时间戳文字)

关于sql - 遇到 SQL 错误 : ORA-01843: not a valid month,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36616974/

相关文章:

sql - 从 Oracle 的 Select (not Distinct) 中的第一列中删除重复项

java - Spring事务回滚 `UPDATE`和 `INSERT`

php - 为什么 (My)SQL 中的 Sum() 函数返回的值是我期望的值的两倍?

oracle - Oracle和PostgreSQL中Write Skew异常不回滚事务

datetime - nutch-solr:将网页元数据中的日期格式化为正确的Solr格式

sql - 将数字转换为日期sql oracle

sql - 如何为多列创建唯一约束?

sql - 加入 3 个表 Oracle SQL

PHP - 将字符串转换为 dateTimeFormat MYSQL

oracle - 执行动态 PL/SQL block 以执行求和并返回值