【问题标题】:ORA-01841 while using TO_DATE with null valuesORA-01841 使用带有空值的 TO_DATE
【发布时间】:2019-06-03 10:44:14
【问题描述】:

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

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

这是由空值引起的吗?怎样才能避免呢?

TO_DATE(TEST.PRELIM_DATE,'YYYYMMDD')`

谢谢

【问题讨论】:

  • 你能添加一些示例数据吗
  • 负1不等于null
  • 所以如果我有一个 -1,并且您希望将其视为 null,您可以先执行 case -1 然后为 null,然后使用 nvl() 函数将该 null 替换为类似1899 年 1 月 1 日的虚假日期或任何对您的申请有意义的日期 - 或将记录视为无效而拒绝
  • 列中的值是什么?四位数的年份?
  • @LukStorms - 1 BC/BCE 之后是 1 AD/CE。没有零年。 en.wikipedia.org/wiki/Year_zero

标签: sql database string oracle date


【解决方案1】:

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 可以是表达式或绑定变量,它必须计算为字符串CHARVARCHAR2NCHAR、或NVARCHAR2 数据类型或null。该函数将return_value 转换为DATE,使用与转换char to DATE. If return_value cannot be converted to DATE 相同的方法,然后该函数返回错误。

【讨论】:

  • 应该注意DEFAULT return_value ON CONVERSION ERROR 是在 Oracle 12.2 中引入的,可能尚未在每个数据库服务器上都可用。
  • 我认为DEFAULT NULL ON CONVERSION ERROR 无论如何都会有用,以防您有无效的日期,例如20190229
  • @GMB 它使用NULLIF 函数工作非常感谢您的及时回复:)
  • @WernfriedDomscheit :感谢您对兼容性的评论ON CONVERSION ERROR,我将其包含在我的回答中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
相关资源
最近更新 更多