Oracle
 sql >> Base de données >  >> RDS >> Oracle

Sélection d'employés dont les anniversaires se situent dans une plage donnée à l'aide d'Oracle SQL

Il existe plusieurs façons de rechercher des plages de dates dans Oracle. Pour votre scénario, je vous suggère de transformer les éléments mois et jour de toutes les dates concernées en nombres.

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

Cela n'utilisera aucun index sur le e.dateOfBirth colonne. Que cela soit important dépend de la fréquence à laquelle vous souhaitez exécuter la requête.

@AdeelAnsari commente :

Quel indice ? Un index normal sur dateOfBirth ne sera d'aucune utilité, car les entrées d'index conduiront avec l'élément year. Cela ne vous aidera donc pas à trouver tous les enregistrements des personnes nées sur tout 23 décembre.

Un index basé sur une fonction - ou en 11g, une colonne virtuelle avec un index (essentiellement la même chose) - est le seul moyen d'indexer des parties d'une colonne de date.