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 votreNLS_DATE_LANGUAGEetNLS_DATE_FORMATré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 datetimeMMà 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 :
DDjour numérique du mois, 1 - 31MMmois numérique de l'année, 01 - 12 ( janvier est 01 )YYYYAnnée à 4 chiffres - à mon avis, c'est toujours mieux qu'une année à 2 chiffresYYcar il n'y a pas de confusion avec le siècle auquel vous faites référence.HH24heure du jour, 0 - 23MIminute de l'heure, 0 - 59SSseconde 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 .