错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0
Posted
技术标签:
【中文标题】错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0【英文标题】:error ORA-01841: (full) year must be between -4713 and +9999, and not be 0 while loading data using yyyymmdd format 【发布时间】:2019-03-21 12:15:08 【问题描述】:以下语句在11-Jan-2019
上引发错误
我们将 paydate 的值检查为20190111
,并且从源头上看是正确的。
但是,代码仍然会引发错误。
ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且不能为 0
INSERT INTO <New_TABLE_NAME>
SELECT *
FROM <old_table_name>
WHERE paydate =TO_DATE(e_paydate,'YYYYMMDD');
【问题讨论】:
如果你说的是真的,那么Oracle有一个bug。否则,它是正确的,你在曲解现实。请张贴表格的描述和示例数据以及证明您所说的 SQL*Plus 会话。 创建了具有相同描述的同一张表,为 20190111 加载了相同的数据,并且加载完美。不知道那天(1 月 11 日)运行失败。我们过去有 3 次运行失败的相同日期。 (20160101、20111011 和 20190111)如果我们看到 mm 和 dd 值只包含 0 和 1 位,则其他运行成功完成。 您在WHERE paydate =TO_DATE(paydate,'YYYYMMDD')
处将列与其自身进行比较。你确定你的代码是这样的吗?
它是 to_date 函数中的一个变量。
请edit your question提供相关详情。如果是v_paydate
而不是paydate
,则编辑它,使查询有意义,并包括paydate
和v_paydate
的数据类型。
【参考方案1】:
TO_DATE( date_string, format_model )
将字符串作为第一个参数。假设paydate
是DATE
数据类型,那么您要求Oracle 将paydate
从DATE
隐式转换为字符串(将使用NLS_DATE_FORMAT
会话参数),然后将其传递给@987654327 @ 函数将其转换回日期。
所以,您的查询是有效的:
SELECT *
FROM <old_table_name>
WHERE paydate =TO_DATE(
TO_CHAR(
paydate,
( SELECT value FROM NLS_SESSION_PARAMETERS WHERE parameter = 'NLS_DATE_FORMAT' )
),
'YYYYMMDD'
);
如果NLS_DATE_FORMAT
与YYYYMMDD
不匹配,那么您将获得异常或意外行为。
相反,如果您想将日期与自身进行比较并确定其时间部分是否为午夜,则只需使用TRUNC
:
SELECT *
FROM <old_table_name>
WHERE paydate = TRUNC( paydate );
【讨论】:
【参考方案2】:如果您使用不带“值”的插入命令,那么您需要将参数的顺序与表结构的顺序完全相同。
由于它正在寻找您传递字符串或其他内容的日期列,因此可能会出现此错误。
检查插入命令的列顺序。
【讨论】:
以上是关于错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0的主要内容,如果未能解决你的问题,请参考以下文章
ORA-01841 :(full) year 必须在 -4713 和 +9999 之间,并且在使用 DBMS_SQL 绑定到动态 sql 时不能为 0
oracle 全年度值没有为零 为啥还出 ora-01841
更新到 ChromeDriver 2.46 后 Chrome 版本必须介于 71 和 75 之间的错误
解决:SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间提示问题
SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间。”应该如何解决?