我有以下表使用日期函數來查詢
報警(AlarmID INT,InstalledDate日期)
鑑於該報警需要是每5年更換,我怎麼顯示所有的報警是在未來6個月內更換?
我嘗試以下,也沒有結果:
SELECT AlarmID
FROM Alarm
WHERE Add_months(InstalledDate, 60)
BETWEEN SYSDATE AND Add_months(SYSDATE, 6);
我有以下表使用日期函數來查詢
報警(AlarmID INT,InstalledDate日期)
鑑於該報警需要是每5年更換,我怎麼顯示所有的報警是在未來6個月內更換?
我嘗試以下,也沒有結果:
SELECT AlarmID
FROM Alarm
WHERE Add_months(InstalledDate, 60)
BETWEEN SYSDATE AND Add_months(SYSDATE, 6);
「我嘗試以下,也沒有結果:」
你提出的查詢看起來是正確的,所以也許你沒有任何五歲的報警器?
「好像存在使用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操作成lt
和gt
聲明:
where date '2012-03-01' >= date '2012-01-01'
and date '2012-03-01' <= date '2012-06-01'
如果交換第二個和第三個表達式的值,您將看到爲什麼相反的順序返回false。
我弄清楚什麼是錯誤的,它似乎有差異使用BETWEEN SYSDATE和Add_months(SYSDATE,6)**與** BETWEEN Add_months(SYSDATE,6)和SYSDATE比較; – FirstTimer
類似於SELECT * FROM ALARM WHERE(InstallDate + 5 years - 6 months)<= NOW。使用SQL的正確方言進行日期添加。這是我的頭頂,用SQL測試它是否正確。 – Pete855217