Há mais de uma maneira de pesquisar intervalos de datas no Oracle. Para o seu cenário, sugiro que você transforme os elementos mês e dia de todas as datas envolvidas em números.
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
Isso não usará nenhum índice no
e.dateOfBirth
coluna. Se isso importa depende da frequência com que você deseja executar a consulta. @AdeelAnsari comenta:
Qual índice? Um índice normal em
dateOfBirth
não será útil, porque as entradas do índice começarão com o elemento ano. Portanto, não ajudará você a encontrar todos os registros de pessoas nascidas em qualquer 23 de dezembro. Um índice baseado em função - ou em 11g, uma coluna virtual com um índice (basicamente a mesma coisa) - é a única maneira de indexar partes de uma coluna de data.