Oracleで日付範囲を検索する方法は複数あります。シナリオでは、関係するすべての日付の月と日の要素を数値に変換することをお勧めします。
select
p.id as person_id,
...
...
where e.active = 1
and to_number (to_char( e.dateOfBirth, 'MMDD'))
between to_number (to_char( FROMDATE, 'MMDD'))
and to_number (to_char( TODATE, 'MMDD'))
order by extract(month from e.dateOfBirth) DESC,
extract(day from e.dateOfBirth) DESC
これは、e.dateOfBirth
のインデックスを使用しません 桁。それが重要かどうかは、クエリを実行する頻度によって異なります。
@AdeelAnsariのコメント:
どんなインデックス? dateOfBirth
の通常のインデックス インデックスエントリは年要素で始まるため、は役に立ちません。したがって、 anyで生まれた人々のすべての記録を見つけるのに役立つわけではありません。 12月23日。
関数ベースのインデックス(または11gでは、インデックス付きの仮想列(基本的に同じもの))は、日付列の一部にインデックスを付ける唯一の方法です。