V Oracle existuje více než jeden způsob vyhledávání časových rozsahů. Pro váš scénář navrhuji převést prvky měsíce a dne všech zahrnutých dat na čísla.
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
Toto nepoužije žádný index na e.dateOfBirth
sloupec. Zda na tom záleží, závisí na tom, jak často chcete dotaz spouštět.
Komentáře @AdeelAnsari:
Jaký index? Normální index na dateOfBirth
nebude k ničemu, protože položky rejstříku povedou s prvkem year. Nepomůže vám tedy najít všechny záznamy o lidech narozených jakýmkoli 23. prosince.
Index založený na funkcích – nebo v 11g, virtuální sloupec s indexem (v podstatě to samé) – je jediným způsobem indexování částí sloupce data.