0

我有下表

警报(AlarmID INT,InstalledDate 日期)

鉴于警报器需要每 5 年更换一次,我如何显示在接下来的 6 个月内需要更换的所有警报器?

我尝试了以下方法,但没有结果:

SELECT AlarmID
FROM   Alarm
WHERE  Add_months(InstalledDate, 60)
BETWEEN SYSDATE AND Add_months(SYSDATE, 6);
4

1 回答 1

1

“我尝试了以下方法,但没有结果:”

您提出的查询看起来是正确的,所以也许您没有任何五年前的警报?


“与 BETWEEN Add_months(SYSDATE, 6) AND SYSDATE 相比,使用 BETWEEN SYSDATE AND Add_months(SYSDATE, 6) 似乎存在差异;”

BETWEEN 运算符要求我们以特定顺序传递两个值,下限然后上限。所以这个过滤器是真的:

where date '2012-03-01' between date '2012-01-01'  and date '2012-06-01'

而这是错误的:

where date '2012-03-01' between date '2012-06-01'  and date '2012-01-01'

也许这看起来不公平,但Oracle 文档lt通过将 BETWEEN 运算符转换为andgt语句使其更加清晰:

where date '2012-03-01' >= date '2012-01-01'  
and   date '2012-03-01' <= date '2012-06-01'

如果你交换第二个和第三个表达式的值,你就会明白为什么颠倒的顺序返回 false。

于 2012-11-11T08:59:42.267 回答