Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Selecionando funcionários com aniversários em determinado intervalo usando Oracle SQL


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.