SQLPLUS (Oracle) - WHERE 子查询以确定日期表达式是否大于 n 天

SQLPLUS (Oracle) - WHERE subquery to determine if date expression greater than n Days

我是 SQL 的新手,在掌握子查询的使用以及相对于外部查询将它们放置在何处时遇到了一些困难。下面的查询是我一直在处理的问题的一部分,似乎无法获得预期的结果。

我需要提取开始日期和结束日期之间的天数。然后检查它是否大于 2 并将其应用于外部查询。此特定尝试 returns "Missing Expression" 而其他迭代(下面的第 2 次查询)返回错误,指出内部查询 returns 多行。(修改为使用 "ALL" 关键字没有产生正确的结果)

QUERY1

SELECT P.PETNAME,P.PETTYPE
FROM PETTREATMENT PT, EXAMINATION E, PET P, TREATMENT T
WHERE PT.EXAMNO = E.EXAMNO
AND E.PETNO = P.PETNO
AND PT.TREATNO = T.TREATNO 
AND (SELECT TO_DATE(PETTREATMENT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PETTREATMENT.STARTDATE,'DD-MON-YYYY') AS TOTALDAYS FROM PETTREATMENT WHERE TOTALDAYS > 2)
AND T.COST >100
ORDER BY P.PETNAME;

查询 2

SELECT P.PETNAME,P.PETTYPE
FROM PETTREATMENT PT, EXAMINATION E, PET P, TREATMENT T
WHERE PT.EXAMNO = E.EXAMNO
AND E.PETNO = P.PETNO
AND PT.TREATNO = T.TREATNO 
AND 2 < (SELECT TO_DATE(PETTREATMENT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PETTREATMENT.STARTDATE,'DD-MON-YYYY') FROM PETTREATMENT)
AND T.COST >100
ORDER BY P.PETNAME;

避免使用旧式联接。因为 enddate 和 startdate 来自 pettreatment table,而您已经 select 从它开始,您可以只在 where 子句中指定条件。不需要 select.

SELECT P.PETNAME,P.PETTYPE
FROM PETTREATMENT PT 
JOIN EXAMINATION E ON PT.EXAMNO = E.EXAMNO
JOIN PET P ON E.PETNO = P.PETNO
JOIN TREATMENT T ON PT.TREATNO = T.TREATNO 
WHERE TO_DATE(PT.ENDDATE,'DD-MON-YYYY') - TO_DATE(PT.STARTDATE,'DD-MON-YYYY') > 2
AND T.COST > 100
ORDER BY P.PETNAME;