Postgresql

運算符不存在:間隔 < 日期

  • April 22, 2020

我想做以下比較:

IF ( V_C_CRITERE2.DATE_FIN_SOUHAITEE - TO_DATE(V_SEUIL_ALERT) &lt; CURRENT_DATE) THEN

DESIRED_END_DATE是一個日期。

但是得到這個錯誤:

operator does not exist: interval &lt; date 

我該如何進行比較?

儘管問題指出這DATE_FIN_SOUHAITEE是一個 DATE,但錯誤消息“運算符不存在:沒有時區的時間戳 - 數字”清楚地表明它確實是一個timestamp. 在 Postgres 中 - 與 Oracle 不同 - a 與 atimestamp有很大不同date(在 Oracle 中,它們或多或少是相同的東西 - 它們只是精度不同)。

在 Postgres 中,您只能interval從 a 中減去 a timestamp,並且可以從 a 中減去整數值date

如果 V_SEUIL_ALERT 確實是一個儲存代表年份的數字的 varchar,則需要將該字元串值轉換為適當的間隔,以​​便能夠從 a 中減去它timestamp

V_C_CRITERE2.DATE_FIN_SOUHAITEE - make_interval(years =&gt; V_SEUIL_ALERT::integer)

然後可以使用&lt;with比較上述內容current_date

我不知道 Oracle 中的原始程式碼做了什麼,因為DATE_FIN_SOUHAITEE - V_SEUIL_ALERT會將 V_SEUIL_ALERT 隱式轉換為 a number,然後將其視為從 DATE_FIN_SOUHAITEE 中減去的**天數,**而不是數年。

如果該列確實儲存天而不是年(如評論中所述),您需要使用:

make_interval(days =&gt; V_SEUIL_ALERT::integer)

真的應該利用該遷移的機會並將列的錯誤數據類型修復為V_SEUIL_ALERT整數、數字,或者即使interval那是您使用它的目的。切勿將數字儲存在 VARCHAR 列中。這在甲骨文中已經是一個非常非常糟糕的主意。

引用自:https://dba.stackexchange.com/questions/265577