首页 > 解决方案 > 错误 ORA-01841:(完整)年份必须在 -4713 和 +9999 之间,并且在使用 yyyymmdd 格式加载数据时不能为 0

问题描述

下面的语句在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');

标签: sqloracleoracle10gdate-formatto-date

解决方案


TO_DATE( date_string, format_model )

将字符串作为其第一个参数。假设paydate是一种DATE数据类型,那么您要求 Oracle 将paydatea隐式转换DATE为字符串(将使用NLS_DATE_FORMATsession 参数),然后将其传递给TO_DATE函数以将其转换回日期。

因此,您的查询实际上是:

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 );

推荐阅读