Es gibt mehrere Möglichkeiten, Datumsbereiche in Oracle zu durchsuchen. Für Ihr Szenario schlage ich vor, dass Sie die Monats- und Tageselemente aller beteiligten Daten in Zahlen umwandeln.
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
Dadurch wird kein Index für e.dateOfBirth
verwendet Säule. Ob das wichtig ist, hängt davon ab, wie oft Sie die Abfrage ausführen möchten.
@AdeelAnsari Kommentare:
Welcher Index? Ein normaler Index auf dateOfBirth
wird nichts nützen, da die Indexeinträge mit dem year-Element beginnen. Es wird Ihnen also nicht helfen, alle Aufzeichnungen von Personen zu finden, die auf irgendeinem geboren wurden 23. Dezember.
Ein funktionsbasierter Index - oder in 11g eine virtuelle Spalte mit einem Index (im Grunde dasselbe) - ist die einzige Möglichkeit, Teile einer Datumsspalte zu indizieren.