Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle-Datum zwischen Abfrage

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