Oracle speichert Daten in einem 7- or 8-byte data structure die immer eine Zeitkomponente enthält. Wenn Sie ein Datum TO_DATE('21-JUN-2016', 'DD-MON-YYYY')
haben, erstellt Oracle das Datum mit der Uhrzeit 00:00:00
.
Wenn Sie das tun:
WHERE TRAN_DATETIME BETWEEN TO_DATE('21-JUN-2016 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
AND TO_DATE('21-JUN-2016 00:00:00', 'DD-MON-YYYY HH24:MI:SS')
Dann werden Sie nur Ergebnisse erhalten, die am Tag sind Sie und haben die Zeitkomponente 00:00:00
.
Jetzt können Sie TRUNC()
verwenden, um die Zeitkomponente zu 00:00:00
einzustellen:
WHERE TRUNC(TRAN_DATETIME) BETWEEN DATE '2016-06-21' AND DATE '2016-06-21'
Wenn es jedoch ein Index für die TRAN_DATETIME
Spalte ist dann diese Abfrage wird es nicht verwenden (es könnte aber verwenden ein funktionsbasierter Index auf TRUNC(TRAN_DATETIME)
).
Eine Lösung, die den Index verwenden kann, ist:
WHERE TRAN_DATETIME >= :start_date
AND TRAN_DATE < :end_date + INTERVAL '1' DAY
(Unter der Annahme, dass :start_date
und :end_date
sind Bindevariable mit einer Zeitkomponente von 00:00:00
übergeben - das ist, was Sie zu tun scheinen).
Einbeziehung der NVL
Aussagen:
WHERE (:start_date IS NULL OR TRAN_DATETIME >= :start_date)
AND (:end_date IS NULL OR TRAN_DATE < :end_date + INTERVAL '1' DAY)
mit 'TRUNC (TRAN_DATETIME)' bedeutet, dass jeder Index für diese Spalte nicht verwendet werden kann. Um einen Index zu verwenden, benötigen Sie einen funktionsbasierten Index. – MT0
Um einen Index zu verwenden, kann er einfach seine aktuelle Abfrage mit Bereich zwischen gestern und heute oder etwas @ MT0 – sagi