以下语句在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');
答案 0 :(得分:0)
TO_DATE( date_string, format_model )
将字符串作为第一个参数。假设paydate
是DATE
数据类型,则您要求Oracle将paydate
从DATE
隐式转换为字符串(它将使用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_FORMAT
与YYYYMMDD
不匹配,那么您将获得异常或意外行为。
相反,如果您想将日期与其自身进行比较,并确定其时间成分是否在午夜,则只需使用TRUNC
:
SELECT *
FROM <old_table_name>
WHERE paydate = TRUNC( paydate );
答案 1 :(得分:0)
如果使用不带“值”的插入命令,则需要按照与表结构完全相同的顺序放置参数。
由于它正在查找要传递字符串或其他内容的日期列,因此可能会出现此错误。
检查插入命令的列顺序。