À 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')