Oracle不平等比较-无效数字

时间:2019-02-13 16:26:48

标签: oracle date-arithmetic arithmetic-expressions

我正在尝试使用以下代码在系统中创建警报。我尝试将其更改一点,但收到错误消息或未返回任何数据。

在我的select语句中,我计算出日期数据与sysdate之间的天数差异。在我的where子句中,我试图通过使用小于或等于运算符来限制通过的数据。

SELECT A.COL_NAME AS "END OF SERVICE", B.DUSER AS "DATE",(TRUNC(B.DUSER) - TRUNC(SYSDATE))AS "DAYS LEFT"
FROM UD_COLS A LEFT OUTER JOIN UD_DATA B
ON A.ID = B.UD_COLS_ID
WHERE A.ID = 52 AND
('DAYS LEFT' <= 30)

这将导致错误:ORA-01722:无效的数字 我尝试更改选择以添加TO_NUMBER(TRUNC(B.DUSER)-TRUNC(SYSDATE)),但仍然收到相同的错误。

我也尝试过更改为('DAYS LEFT'<='30'),但我没有收到任何错误,但未按预期返回数据。

这里没有('DAYS LEFT'<= 30),我在“ DAYS LEFT”列中看到的值为1。这不是数值吗?

如果我使用> =运算符,则无论值如何,数据都会填充。

谢谢。

1 个答案:

答案 0 :(得分:3)

威廉·罗伯逊(William Robertson)在对您的问题的评论中解释了您的代码有什么问题(两件事,一件事可以纠正-将单引号更改为双引号-另一则无法解决-您无法在where子句是在同一查询的select子句中定义的别名。

最简单的解决方法是将where子句更改为

where b.duser < trunc(sysdate) + 31

这等效于您使用trunc(b.duser)的情况,但是其编写方式是不对b.duser应用任何函数调用-这样可以更快地执行代码,如果有,则可以更快地执行代码该列上的索引。