我想做以下比较:
IF ( V_C_CRITERE2.DATE_FIN_SOUHAITEE - TO_DATE(V_SEUIL_ALERT) < CURRENT_DATE) THEN
DATE_FIN_SOUHAITEE是一个日期。
但是得到这个错误:
operator does not exist: interval < date
我该如何进行比较?
我想做以下比较:
IF ( V_C_CRITERE2.DATE_FIN_SOUHAITEE - TO_DATE(V_SEUIL_ALERT) < CURRENT_DATE) THEN
DATE_FIN_SOUHAITEE是一个日期。
但是得到这个错误:
operator does not exist: interval < date
我该如何进行比较?
尽管问题指出这
DATE_FIN_SOUHAITEE
是一个 DATE,但错误消息“运算符不存在:没有时区的时间戳 - 数字”清楚地表明它确实是一个timestamp
. 在 Postgres 中 - 与 Oracle 不同 - a 与 atimestamp
有很大不同date
(在 Oracle 中,它们或多或少是相同的东西 - 它们只是精度不同)。在 Postgres 中,您只能
interval
从 a 中减去 atimestamp
,并且可以从 a 中减去整数值date
如果 V_SEUIL_ALERT 确实是一个存储代表年份的数字的 varchar,则需要将该字符串值转换为适当的间隔,以便能够从 a 中减去它
timestamp
:然后可以使用
<
with比较上述内容current_date
。我不知道 Oracle 中的原始代码做了什么,因为
DATE_FIN_SOUHAITEE - V_SEUIL_ALERT
会将 V_SEUIL_ALERT 隐式转换为 anumber
,然后将其视为从 DATE_FIN_SOUHAITEE 中减去的天数,而不是数年。如果该列确实存储天而不是年(如评论中所述),您需要使用:
您真的应该利用该迁移的机会并将列的错误数据类型修复为
V_SEUIL_ALERT
整数、数字,或者即使interval
那是您使用它的目的。切勿将数字存储在 VARCHAR 列中。这在甲骨文中已经是一个非常非常糟糕的主意。