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

「次のことを試しましたが、結果はありませんでした。」

提案するクエリは正しいように見えるので、おそらく5年前のALARMSがありませんか?


「BETWEENSYSDATEANDAdd_months(SYSDATE、6)を使用した場合と、BETWEEN Add_months(SYSDATE、6)ANDSYSDATEを使用した場合とでは違いがあるようです。」

BETWEEN演算子は、2つの値を特定の順序(下限、上限)で渡すことを要求します。したがって、このフィルターは真です。

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演算子を次のgtステートメントに変換することで明確にしています。

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

2番目と3番目の式の値を入れ替えると、逆の順序でfalseが返される理由がわかります。

于 2012-11-11T08:59:42.267 に答える