31-DEC-95
n'est pas une chaîne, ni ne l'est 20-JUN-94
. Ce sont des chiffres avec des éléments supplémentaires ajoutés à la fin. Cela devrait être '31-DEC-95'
ou '20-JUN-94'
- noter la citation unique '
. 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 la TO_DATE()
fonction intégrée, soit un littéral de date .
À CE JOUR()
select employee_id
from employee
where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
Cette méthode présente quelques pièges inutiles
- Comme a_horse_with_no_name noté dans les commentaires
DEC
, ne signifie pas nécessairement décembre. Cela dépend de vos paramètres NLS_DATE_LANGUAGE
et NLS_DATE_FORMAT
. Pour vous assurer que votre comparaison fonctionne dans tous les paramètres régionaux, vous pouvez utiliser le modèle de format datetime à la MM
place
- L'année 95 est inexacte. Vous savez que vous voulez dire 1995, mais que se passerait-il si c'était 50, est-ce que c'est 1950 ou 2050? Il vaut toujours mieux ê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 spécifier votre date dans le format YYYY-MM-DD
et vous ne pouvez pas inclure d'élément d'heure.
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, de sorte que la date sans partie d'heure équivaut à 1995-12-31 00:00:00
.
Si vous souhaitez inclure une partie de l'heure, 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'
Informations complémentaires
NLS_DATE_LANGUAGE
est dérivé NLS_LANGUAGE
et NLS_DATE_FORMAT
dérivé de NLS_TERRITORY
. Celles-ci sont définies lors de la création initiale de la base de données, mais elles peuvent être modifiées en modifiant votre fichier de paramètres d'inialisation - uniquement si cela est vraiment nécessaire - ou au niveau de la session en utilisant la ALTER SESSION
syntaxe. Par exemple:
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
Ça 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 aucune confusion avec le siècle auquel vous faites référence.
HH24
heure de la journée, 0-23
MI
minute de l'heure, 0 - 59
SS
seconde de la minute, 0-59
Vous pouvez trouver votre langue actuelle et vos paramètres de langue de date en interrogeant V$NLS_PARAMETERSs
et la gamme complète des valeurs valides en interrogeant V$NLS_VALID_VALUES
.
Lectures complémentaires
Incidemment, si vous voulez que count(*)
vous ayez besoin de grouper paremployee_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
.
> <
ouBETWEEN '' AND ''