Oracle хранит даты в 7- or 8-byte data structure который всегда включает в себя компонент времени.
Когда у вас есть дата TO_DATE('21-JUN-2016', 'DD-MON-YYYY')
, тогда Oracle создаст дату со временем 00:00:00
.
Если вы:
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')
Тогда вы получите только результаты, которые на следующий день вы хотите и имеют временную составляющую 00:00:00
.
Теперь вы можете использовать TRUNC()
, чтобы установить компонент времени на 00:00:00
:
WHERE TRUNC(TRAN_DATETIME) BETWEEN DATE '2016-06-21' AND DATE '2016-06-21'
Однако, если существует индекс на TRAN_DATETIME
колонке, то этот запрос не будет использовать его (это, однако, может использовать функциональный индекс на TRUNC(TRAN_DATETIME)
).
Решение, которое может использовать индекс является:
WHERE TRAN_DATETIME >= :start_date
AND TRAN_DATE < :end_date + INTERVAL '1' DAY
(Предполагая, что :start_date
и :end_date
являются переменной связывания передается с использованием временной составляющей 00:00:00
- что то, что вы, кажется, делают).
NVL
Включение в отчетность:
WHERE (:start_date IS NULL OR TRAN_DATETIME >= :start_date)
AND (:end_date IS NULL OR TRAN_DATE < :end_date + INTERVAL '1' DAY)
Использование 'TRUNC (TRAN_DATETIME)' будет означать, что любой индекс на этой колонке не могут быть использованы. Чтобы использовать индекс, вам понадобится индекс на основе функций. – MT0
Чтобы использовать индекс, он может просто использовать свой текущий запрос с диапазоном между вчера и сегодня или что-то @ MT0 – sagi