2012-11-11 50 views
0

我有以下表使用日期函數來查詢

報警(AlarmID INT,InstalledDate日期)

鑑於該報警需要是每5年更換,我怎麼顯示所有的報警是在未來6個月內更換?

我嘗試以下,也沒有結果:

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

類似於SELECT * FROM ALARM WHERE(InstallDate + 5 years - 6 months)<= NOW。使用SQL的正確方言進行日期添加。這是我的頭頂,用SQL測試它是否正確。 – Pete855217

回答

1

「我嘗試以下,也沒有結果:」

你提出的查詢看起來是正確的,所以也許你沒有任何五歲的報警器?


「好像存在使用BETWEEN SYSDATE AND ADD_MONTHS的差(SYSDATE,6)比較ADD_MONTHS(SYSDATE,6)和 SYSDATE BETWEEN;」

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' 

或許這似乎不公平,但the Oracle documentation使得它更清晰的通過翻譯BETWEEN操作成ltgt聲明:

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

如果交換第二個和第三個表達式的值,您將看到爲什麼相反的順序返回false。

+0

我弄清楚什麼是錯誤的,它似乎有差異使用BETWEEN SYSDATE和Add_months(SYSDATE,6)**與** BETWEEN Add_months(SYSDATE,6)和SYSDATE比較; – FirstTimer