我有一个日期列,其格式设置为number(10)数据类型。有些记录包含-1值(空)。我想格式化该列为日期类型。使用TO_DATE
函数将返回以下消息:
ORA-01841 :(完整)年份必须在-4713和+9999之间,并且不能为0
这是由空值引起的吗?如何避免这种情况?
TO_DATE(TEST.PRELIM_DATE,'YYYYMMDD')`
谢谢
答案 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
可以是表达式或绑定变量,并且必须求值为字符串CHAR
,VARCHAR2
,NCHAR
或NVARCHAR2
的字符串或null
。该函数使用与转换return_value
相同的方法将DATE
转换为char to
,然后该函数返回错误。DATE
. Ifreturn_value
cannot be converted to DATE