错误 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,则编辑它,使查询有意义,并包括paydatev_paydate 的数据类型。 【参考方案1】:
TO_DATE( date_string, format_model )

将字符串作为第一个参数。假设paydateDATE 数据类型,那么您要求Oracle 将paydateDATE 隐式转换为字符串(将使用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_FORMATYYYYMMDD 不匹配,那么您将获得异常或意外行为。

相反,如果您想将日期与自身进行比较并确定其时间部分是否为午夜,则只需使用TRUNC

SELECT   *
FROM     <old_table_name>
WHERE    paydate = TRUNC( paydate );

【讨论】:

【参考方案2】:

如果您使用不带“值”的插入命令,那么您需要将参数的顺序与表结构的顺序完全相同。

由于它正在寻找您传递字符串或其他内容的日期列,因此可能会出现此错误。

检查插入命令的列顺序。

【讨论】:

以上是关于错误 ORA-01841:(完整)年份必须介于 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0的主要内容,如果未能解决你的问题,请参考以下文章

错误 ORA-01841:在文件中传递出生日期时

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之间。”应该如何解决?