【问题标题】:ORA-01841 error : year must be between -4713 and +9999, and not be 0ORA-01841 错误:年份必须介于 -4713 和 +9999 之间,而不是 0
【发布时间】:2021-01-29 12:58:18
【问题描述】:

我有一个 plsql 块,我收到“ORA-01841: (full) year must be between -4713 and +9999, and not be 0”错误。我的 where 子句是这样的;

WHERE TO_DATE(MK.CREATE_DATE||'-01','YYYY-MM-DD') BETWEEN trunc(add_months(trunc(sysdate),-1),'MM') and trunc(sysdate,'MM')-1 

mk.create_date format 是 '2020-01','2020-02' exc.

我的意思是获取上个月的值。

有人帮我吗? 谢谢

【问题讨论】:

  • 显然,并非 CREATE_DATE 中的所有值都具有有效的 year 值作为前 4 个字符。找到并修复它们。
  • 也可以随意摆脱between,您正在从create_date 创建每月的第一天,因此与上个月的第一天进行比较就足够了。以及为什么将CREATE_DATE 转换为可以转换另一侧的日期(并且可能保持 CREATE_DATE 上的索引正常工作,更好的是首先将CREATE_DATE 存储为DATE 列)。 WHERE MK.CREATE_DATE = TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'YYYY-MM')
  • 您的转换不需要串联。只需使用 to_date(mk.create_date,'yyyy-mm') 但我会回应 @Petr,始终将日期值存储为 DATE(或 TIMESTAMP)。然后几乎所有你想做的事情都可以在不转换为字符串的情况下完成,除了显示它们是一种特定的格式。见example

标签: oracle date plsql


【解决方案1】:

您可以使用on conversion error 来清除损坏的数据(oracle 12.2 或更高版本)。

TO_DATE(MK.CREATE_DATE||'-01','YYYY-MM-DD' default null on conversion error)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多