Ihrer Ausgabe nach zu urteilen, sieht es so aus, als hätten Sie START_DATE als Zeitstempel definiert. Wenn es sich um ein reguläres Datum handeln würde, wäre Oracle in der Lage, die implizite Konvertierung durchzuführen. Da dies jedoch nicht der Fall ist, müssen Sie diese Zeichenfolgen explizit in Datumsangaben umwandeln.
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>
Aber wir bekommen immer noch nur eine Zeile. Dies liegt daran, dass START_DATE ein Zeitelement enthält. Wenn wir die Zeitkomponente nicht angeben, verwendet Oracle standardmäßig Mitternacht. Das ist in Ordnung für from Seite von BETWEEN
aber nicht für bis Seite:
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>
bearbeiten
Wenn Sie die Zeitkomponente nicht eingeben können, gibt es ein paar Möglichkeiten. Eine besteht darin, die WHERE-Klausel zu ändern, um das Zeitelement aus den Kriterien zu entfernen:
where trunc(start_date) between to_date('15-JAN-10')
and to_date('17-JAN-10')
Dies kann sich auf die Leistung auswirken, da es jeden B-Tree-Index am START_DATE disqualifiziert. Sie müssten stattdessen einen funktionsbasierten Index erstellen.
Alternativ könnten Sie das Zeitelement zum Datum in Ihrem Code hinzufügen:
where start_date between to_date('15-JAN-10')
and to_date('17-JAN-10') + (86399/86400)
Aufgrund dieser Probleme vermeiden viele Leute die Verwendung von between
indem Sie wie folgt nach Datumsgrenzen suchen:
where start_date >= to_date('15-JAN-10')
and start_date < to_date('18-JAN-10')