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

Comparaison avec la date dans Oracle sql

Le problème est double. Premièrement, les dates ont presque certainement des composantes temporelles. to_date('06-MAR-11','DD-MON-YY') est équivalent à 2011/03/06 00:00:00 . Si vous utilisez le TRUNC() fonction, vous pourrez tout voir pour ce jour :

select * 
  from test_table
 where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');

Je ne le ferais pas utilisez le modèle de format datetime MON. Comme je l'explique ici, cela dépend de votre région et de vos paramètres. Il est plus sûr d'utiliser un modèle de format de mois numérique à la place. De même, spécifiez toujours le siècle dans le cadre de l'année.

where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');

Votre deuxième problème est presque certainement votre NLS_DATE_FORMAT ; il semble ne pas tenir compte de l'heure, d'où la raison pour laquelle vous voyez 4 dates identiques. Cela régit uniquement la manière dont les données sont affichées pas comment il est stocké.

Vous pouvez changer cela en utilisant quelque chose comme :

ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"

Si je configure un environnement de test en utilisant ce qui suit :

create table test_table ( creation_date date );
insert into test_table values ( sysdate );
insert into test_table values ( sysdate - 0.01 );
alter session set nls_date_format = "YYYY/MM/DD";

Vous pouvez voir que les données renvoyées n'incluent pas l'heure (bien que SYSDATE le fasse) :

SQL> select * from test_table;

CREATION_D
----------
2013/04/12
2013/04/12

En modifiant le NLS_DATE_FORMAT et en effectuant le même SELECT, vous obtenez maintenant un composant de temps :

SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";

Session altered.

SQL> select * from test_table;

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

Enfin, lorsque vous essayez de sélectionner la date d'aujourd'hui seule, aucune ligne ne sera renvoyée :

SQL> select *
  2    from test_table
  3   where creation_date = to_date('20130412','yyyymmdd');

no rows selected

Mais, lors de l'utilisation de TRUNC() pour comparer uniquement la partie date du champ, vous obtenez à nouveau toutes vos lignes :

SQL> select *
  2    from test_table
  3   where trunc(creation_date) = to_date('20130412','yyyymmdd');

CREATION_DATE
-------------------
2013/04/12 12:48:41
2013/04/12 12:34:17

Pour répondre réellement à votre deuxième question, si vous voulez des dates uniques, vous pouvez réutiliser le TRUNC() fonction :

select distinct trunc(creation_date)
  from test_table