我正在尝试使用以下代码在系统中创建警报。我尝试将其更改一点,但收到错误消息或未返回任何数据。
在我的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。这不是数值吗?
如果我使用> =运算符,则无论值如何,数据都会填充。
谢谢。
答案 0 :(得分:3)
威廉·罗伯逊(William Robertson)在对您的问题的评论中解释了您的代码有什么问题(两件事,一件事可以纠正-将单引号更改为双引号-另一则无法解决-您无法在where
子句是在同一查询的select
子句中定义的别名。
最简单的解决方法是将where
子句更改为
where b.duser < trunc(sysdate) + 31
这等效于您使用trunc(b.duser)
的情况,但是其编写方式是不对b.duser
应用任何函数调用-这样可以更快地执行代码,如果有,则可以更快地执行代码该列上的索引。