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