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

问题描述 投票:-1回答:1

下面的语句在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');
sql oracle oracle10g date-format to-date
1个回答
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 );
© www.soinside.com 2019 - 2024. All rights reserved.