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

Date Oracle Entre Requête

À en juger par votre sortie, il semble que vous ayez défini START_DATE comme horodatage. S'il s'agissait d'une date régulière, Oracle serait en mesure de gérer la conversion implicite. Mais comme ce n'est pas le cas, vous devez convertir explicitement ces chaînes en dates.

SQL> alter session set nls_date_format = 'dd-mon-yyyy hh24:mi:ss'
  2  /

Session altered.

SQL>
SQL> select * from t23
  2  where start_date between '15-JAN-10' and '17-JAN-10'
  3  /

no rows selected

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') and to_date('17-JAN-10')
  3  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000    

SQL> 

Mais nous n'obtenons toujours qu'une seule ligne. C'est parce que START_DATE a un élément de temps. Si nous ne spécifions pas le composant horaire, Oracle le définit par défaut sur minuit. C'est bien pour le de côté de BETWEEN mais pas pour le jusqu'à côté :

SQL> select * from t23
  2  where start_date between to_date('15-JAN-10') 
  3                       and to_date('17-JAN-10 23:59:59')
  4  /

WIDGET                          START_DATE
------------------------------  ----------------------
Small Widget                    15-JAN-10 04.25.32.000
Product 1                       17-JAN-10 04.31.32.000

SQL>

modifier

Si vous ne pouvez pas transmettre la composante temporelle, vous avez plusieurs choix. L'une consiste à modifier la clause WHERE pour supprimer l'élément de temps des critères :

where trunc(start_date) between to_date('15-JAN-10') 
                            and to_date('17-JAN-10')

Cela peut avoir un impact sur les performances, car cela disqualifie tout index b-tree le START_DATE. Vous auriez besoin de créer un index basé sur les fonctions à la place.

Vous pouvez également ajouter l'élément d'heure à la date dans votre code :

where start_date between to_date('15-JAN-10') 
                     and to_date('17-JAN-10') + (86399/86400) 

En raison de ces problèmes, de nombreuses personnes préfèrent éviter l'utilisation de between en vérifiant les limites de dates comme ceci :

where start_date >= to_date('15-JAN-10') 
and start_date < to_date('18-JAN-10')