【发布时间】: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。