Oracle
 sql >> Database >  >> RDS >> Oracle

Selezione di dipendenti con compleanni in un determinato intervallo utilizzando Oracle SQL

C'è più di un modo per cercare intervalli di date in Oracle. Per il tuo scenario ti suggerisco di trasformare in numeri gli elementi mese e giorno di tutte le date coinvolte.

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

Questo non utilizzerà alcun indice su e.dateOfBirth colonna. L'importanza di ciò dipende dalla frequenza con cui desideri eseguire la query.

@AdeelAnsari commenta:

Quale indice? Un normale indice su dateOfBirth non sarà di alcuna utilità, perché le voci dell'indice porteranno con l'elemento year. Quindi non ti aiuterà a trovare tutti i record di persone nate su qualsiasi 23 dicembre.

Un indice basato su funzioni - o in 11g, una colonna virtuale con un indice (praticamente la stessa cosa) - è l'unico modo per indicizzare parti di una colonna di data.