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_LANGUAGE
etNLS_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 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 :
DD
jour numérique du mois, 1 - 31MM
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 chiffresYY
car il n'y a pas de confusion avec le siècle auquel vous faites référence.HH24
heure du jour, 0 - 23MI
minute de l'heure, 0 - 59SS
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
.