Il existe plusieurs façons de rechercher des plages de dates dans Oracle. Pour votre scénario, je vous suggère de transformer les éléments mois et jour de toutes les dates concernées en nombres.
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
Cela n'utilisera aucun index sur le e.dateOfBirth
colonne. Que cela soit important dépend de la fréquence à laquelle vous souhaitez exécuter la requête.
@AdeelAnsari commente :
Quel indice ? Un index normal sur dateOfBirth
ne sera d'aucune utilité, car les entrées d'index conduiront avec l'élément year. Cela ne vous aidera donc pas à trouver tous les enregistrements des personnes nées sur tout 23 décembre.
Un index basé sur une fonction - ou en 11g, une colonne virtuelle avec un index (essentiellement la même chose) - est le seul moyen d'indexer des parties d'une colonne de date.