web-dev-qa-db-fra.com

Comparaison de dates dans Oracle SQL

J'essaie de l'afficher pour afficher le nombre d'employés embauchés après le 20 juin 1994. Cependant, une erreur s'affiche indiquant "Identifiant invalide de JUN". Aidez-moi, merci!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 
124
user1336830

_31-DEC-95_ n'est pas une chaîne, ni _20-JUN-94_. Ce sont des chiffres avec des 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îne.

Cependant, vous ne faites pas de comparaison de chaîne; vous effectuez une comparaison de date . Vous devriez transformer votre chaîne en date. Soit en utilisant la fonction intégrée TO_DATE() , ou 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 a quelques pièges inutiles

  • Comme le note un_horse_with_no_name dans les commentaires, DEC ne signifie pas nécessairement décembre. Cela dépend de vos NLS_DATE_LANGUAGE et NLS_DATE_FORMAT paramètres. Pour vous assurer que votre comparaison avec les paramètres régionaux fonctionne, vous pouvez utiliser le modèle de format de date/heureMM à la place.
  • L'année 95 est inexacte. Vous savez que vous parlez de 1995, mais que se passerait-il si c'était en 1950, s'agit-il de 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')
_

Date littéraux

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

_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 heure, de sorte que la date sans partie heure est équivalente à _1995-12-31 00:00:00_.

Si vous souhaitez inclure une partie heure, vous devez utiliser un littéral timestamp, qui prend la forme _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 vous pouvez les modifier en modifiant votre fichier de paramètres d'inialisation - uniquement si cela est vraiment nécessaire - ou au niveau de la session à l'aide de la syntaxe ALTER SESSION . Par exemple:

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

Ça signifie:

  • DD jour numérique du mois, du 1 au 31
  • MM mois numérique de l'année, 01-12 (janvier est 01)
  • YYYY Année à 4 chiffres - À mon avis, cette valeur est toujours meilleure qu'une année à 2 chiffres YY car il n'y a pas de confusion avec De quel siècle parlez-vous?.
  • _HH24_ heure du jour, 0 - 23
  • MI minute de l'heure, 0 - 59
  • SS seconde de la minute, 0-59

Vous pouvez connaître votre langue et vos paramètres de langue actuels en interrogeant _V$NLS_PARAMETERSs_ et toute la gamme des valeurs valides en interrogeant _V$NLS_VALID_VALUES_.

Lectures complémentaires


Incidemment, si vous voulez la count(*) vous devez grouper 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_.

270
Ben

Conclusion,

to_char fonctionne à sa manière

Alors,

Utilisez toujours ce format AAAA-MM-JJ pour la comparaison au lieu de MM-JJ-AA ou JJ-MM-AAAA ou tout autre format.

5
akshay gulawane

Vous pouvez utiliser trunc et to_date comme suit:

select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
from ils_det_guia dg, ils_guia g
where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
and dg.LAB_CODIGO = 56 
and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
order by g.FECHA;
4
Giovanny Farto M.

de votre requête:

Select employee_id, count(*) From Employee 
Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 

je pense que ce n'est pas pour afficher le nombre d'employés embauchés après le 20 juin 1994. Si vous voulez afficher le nombre d'employés, vous pouvez utiliser:

Select count(*) From Employee 
Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 

Je pense que la meilleure pratique pour comparer les dates que vous pouvez utiliser:

employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
or
to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
2
viduka