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

Comparer des dates dans Oracle SQL

31-DEC-95 n'est pas une chaîne, ni 20-JUN-94 . Ce sont des chiffres avec quelques trucs supplémentaires ajoutés à la fin. Cela devrait être '31-DEC-95' ou '20-JUN-94' - notez le guillemet simple, ' . Cela vous permettra de faire une comparaison de chaînes.

Cependant, vous ne faites pas de comparaison de chaînes ; vous faites une comparaison de dates . Vous devez transformer votre chaîne en date. Soit en utilisant le TO_DATE() intégré fonction ou un littéral de date.

TO_DATE()

select employee_id
  from employee
 where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')

Cette méthode comporte quelques pièges inutiles

  • Comme l'a noté a_horse_with_no_name dans les commentaires, DEC , ne signifie pas nécessairement décembre. Cela dépend de votre NLS_DATE_LANGUAGE et NLS_DATE_FORMAT réglages. Pour vous assurer que votre comparaison avec fonctionne dans n'importe quel paramètre régional, vous pouvez utiliser le modèle de format datetime MM à la place
  • L'année 95 est inexacte. Vous savez que vous voulez dire 1995, mais et si c'était 1950, est-ce 1950 ou 2050 ? Il est toujours préférable d'être explicite
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

Littéraux de date

Un littéral de date fait partie de la norme ANSI, ce qui signifie que vous n'avez pas besoin d'utiliser une fonction spécifique à Oracle. Lorsque vous utilisez un littéral, vous devez indiquez votre date au format YYYY-MM-DD et vous ne pouvez pas inclure d'élément de temps.

select employee_id
  from employee
 where employee_date_hired > date '1995-12-31'

N'oubliez pas que le type de données de date Oracle inclut un élément d'heure, donc la date sans partie d'heure équivaut à 1995-12-31 00:00:00 .

Si vous souhaitez inclure une portion de temps, vous devez utiliser un littéral d'horodatage, qui prend le format YYYY-MM-DD HH24:MI:SS[.FF0-9]

select employee_id
  from employee
 where employee_date_hired > timestamp '1995-12-31 12:31:02'

Plus d'informations

NLS_DATE_LANGUAGE est dérivé de NLS_LANGUAGE et NLS_DATE_FORMAT est dérivé de NLS_TERRITORY . Ceux-ci sont définis lors de la création initiale de la base de données, mais ils peuvent être modifiés en modifiant votre fichier de paramètres d'initialisation - uniquement si cela est vraiment nécessaire - ou au niveau de la session en utilisant le ALTER SESSION syntaxe. Par exemple :

alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';

Cela signifie :

  • DD jour numérique du mois, 1 - 31
  • MM mois numérique de l'année, 01 - 12 ( janvier est 01 )
  • YYYY Année à 4 chiffres - à mon avis, c'est toujours mieux qu'une année à 2 chiffres YY car il n'y a pas de confusion avec le siècle auquel vous faites référence.
  • HH24 heure du jour, 0 - 23
  • MI minute de l'heure, 0 - 59
  • SS seconde de la minute, 0-59

Vous pouvez connaître vos paramètres de langue et de date actuels en interrogeant V$NLS_PARAMETERSs et la gamme complète des valeurs valides en interrogeant V$NLS_VALID_VALUES .

Autres lectures

  • Modèles de format

Accessoirement, si vous voulez le count(*) vous devez regrouper par employee_id

select employee_id, count(*)
  from employee
 where employee_date_hired > date '1995-12-31'
 group by employee_id

Cela vous donne le nombre par employee_id .