ORA-01841,同时将TO_DATE与空值一起使用

时间:2019-01-08 17:33:25

标签: sql oracle

我有一个日期列,其格式设置为number(10)数据类型。有些记录包含-1值(空)。我想格式化该列为日期类型。使用TO_DATE函数将返回以下消息:

  

ORA-01841 :(完整)年份必须在-4713和+9999之间,并且不能为0

这是由空值引起的吗?如何避免这种情况?

TO_DATE(TEST.PRELIM_DATE,'YYYYMMDD')`

谢谢

1 个答案:

答案 0 :(得分:3)

Oracle函数TO_DATE确实接受NULL值(在这种情况下返回NULL)。您得到的错误意味着给定值与指定格式不匹配。

如果-1是可能显示的唯一无效值,则将其替换为NULL,例如:

TO_DATE(
    NULLIF(TEST.PRELIM_DATE, -1),
    'YYYYMMDD'
)

从Oracle 12.2开始,另一种解决方案是使用ON CONVERSION ERROR子句,例如:

TO_DATE(
    TEST.PRELIM_DATE,
    'YYYYMMDD'
) DEFAULT NULL ON CONVERSION ERROR

这将捕获所有转换错误并返回NULL而不是引发错误(请注意,这可能会导致掩盖合法错误)。来自the documentation

  

可选的DEFAULT return_value ON CONVERSION ERROR子句允许您指定将char转换为DATE时发生错误时此函数返回的值。如果在评估char时发生错误,则此子句无效。 return_value可以是表达式或绑定变量,并且必须求值为字符串CHARVARCHAR2NCHARNVARCHAR2的字符串或null。该函数使用与转换return_value相同的方法将DATE转换为char to DATE. If return_value cannot be converted to DATE,然后该函数返回错误。