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

时间:2019-03-21 12:15:09

标签: sql oracle oracle10g date-format to-date

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

2 个答案:

答案 0 :(得分:0)

TO_DATE( date_string, format_model )

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

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

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

答案 1 :(得分:0)

如果使用不带“值”的插入命令,则需要按照与表结构完全相同的顺序放置参数。

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

检查插入命令的列顺序。