Oracle不平等比较-无效数字

Oracle不平等比较-无效数字,oracle,date-arithmetic,arithmetic-expressions,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 JOI

我正在尝试使用以下代码在我的系统中创建警报。我试着把它改大一点,但收到错误或没有返回数据

在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)
选择A.COL_NAME作为“服务结束”,选择B.DUSER作为“日期”,选择(TRUNC(B.DUSER)-TRUNC(SYSDATE))作为“剩余天数”
从UD_列A左外连接UD_数据B
关于A.ID=B.UD\u COLS\u ID
其中A.ID=52,且

(“还剩几天”William Robertson在对您的问题的评论中解释了代码的错误(两件事,一件是可以纠正的——将单引号改为双引号——另一件是无法修复的——您不能在
where
子句中引用同一查询的
select
子句中定义的别名)

最简单的修复方法是将
where
子句更改为

where b.duser < trunc(sysdate) + 31
其中b.duser

这相当于使用
trunc(b.duser)时的情况
,但它的编写方式是不对
b.duser
应用函数调用,从而加快了执行速度,如果该列上有索引,则执行速度会快得多。

William Robertson在对您的问题的评论中解释了代码的错误(两件事,一件是可以更正的——将单引号更改为双引号——另一件是无法修复的——您不能在
where
子句中引用同一查询的
select
子句中定义的别名)

最简单的修复方法是将
where
子句更改为

where b.duser < trunc(sysdate) + 31
其中b.duser

这相当于使用
trunc(b.duser)时的情况
,但它的编写方式是不对
b.duser
应用函数调用,从而加快了执行速度,如果该列上有索引,则执行速度会快得多。

您不能在SELECT列表中定义表达式,然后在WHERE子句中引用它。此外,单引号定义的是文本文字,而不是标识符s(使用双引号表示),上面的代码是SQL而不是PL/SQL。您似乎对数据类型感到非常困惑。为什么要尝试“还剩几天”谢谢大家。这非常有用。我刚刚开始我的旅程,学习关系数据库、SQL、DML以及其他所有相关的内容。我读的很多东西都是外国的,所以我很感谢您花时间和简化它wn。您不能在SELECT列表中定义表达式,然后在WHERE子句中引用它。此外,单引号定义文本文字而不是标识符(使用双引号),上面的代码是SQL而不是PL/SQL。您似乎对数据类型感到非常困惑。为什么要尝试“还剩几天”谢谢大家。这非常有用。我刚刚开始我的旅程,学习关系数据库、SQL、DML以及其他所有相关的内容。我读的很多东西都是外国的,所以我很感谢您花时间和简化它给我打电话。