next_day および通常の日付演算。以下のコードはかなり近いはずですが、テストされておらず、いくつかのコーナーケースで失敗する可能性がありますが、少なくとも一般的なアイデアは得られます:)
where resolved_date >= next_day( trunc(sysdate) - interval '14' day, 'SUN')
and resolved_date < next_day( trunc(sysdate) - interval '7' day, 'SUN')
trunc(sysdate)
日付を毎日切り捨てます。 2011-04-1923:32:34は2011-04-1900:00:00になります。つまり、時間コンポーネントを削除します。next_day(sysdate, 'SUN')
次の日曜日を返します。 sysdateがたまたま日曜日の場合、次の日曜日が返されます。
重要 :曜日の名前はセッションと同じ言語である必要があります。interval
物事は、日付から異なる時間単位を加算/減算する標準的な方法にすぎません。
すべてをまとめると、2011年4月19日のロジックは次のようになります。
- sysdateの切り捨て=>2011-04-1900:00:00
- 14日を引く=>2011-04-0500:00:00
- 次の日曜日を探す=>2011-04-1000:00:00
...そして
- sysdateの切り捨て=>2011-04-1900:00:00
- 7日を引く=>2011-04-1200:00:00
- 次の日曜日を探す=>2011-04-1700:00:00
..次のクエリが発生します:
where resolved_date >= timestamp '2011-04-10 00:00:00'
and resolved_date < timestamp '2011-04-17 00:00:00'
10:thの最初の1秒以降、17:thの最初の1秒より前に発生したすべてのresolved_datesが含まれます。 >=
に注意してください および<
between
と同等ではありません 。
パフォーマンスに関する注意:Oracleが日付範囲を7日と正しく推定し、正しい結合順序/方法が使用されていることを確認します。クエリがしばらく実行されると予想される場合は、上記のようにオンザフライで計算する代わりに、アプリケーションで日付を計算して日付文字として提供する余裕があります。