Вы сравниваете значения столбцов со строковыми значениями, что означает, что Oracle неявно преобразует строки в даты или временные метки, используя настройки сеанса NLS. Вы можете видеть это из шагов фильтра плана выполнения:
1 - filter("C"."CALLTIMESTAMP">=TO_TIMESTAMP('16/05/18') AND
"C"."CALLTIMESTAMP"<=TO_TIMESTAMP('17/05/18'))
Эти неявно преобразованные значения имеют компонент времени, установленный на полночь. (Они также очень хрупкие, поскольку полагаются на используемую вами строку, соответствующую настройке сеанса, которая не всегда будет под вашим контролем).
Это означает, что вы ищете значения между 2018-05-16 00:00:00 и 2018-05-17 00:00:00. 16-го числа будут получены значения в любое время суток, но 17-го числа будут найдены записи, которые ровно в полночь.
Обычный способ сделать это с диапазоном, большим или равным вашей дате начала, и меньшим, чем день после вашей даты окончания - что означает, что вы поймаете каждый до но не включая полночь в этот день.
AND C.CALLTIMESTAMP >= timestamp '2018-05-16 00:00:00'
AND C.CALLTIMESTAMP < timestamp '2018-05-18 00:00:00'
, который найдет все записи в любое время 16 или 17 числа.
Если столбец на самом деле является датой, а не отметкой времени, вы можете использовать литералы даты вместо:
AND C.CALLTIMESTAMP >= date '2018-05-16'
AND C.CALLTIMESTAMP < date '2018-05-18';
Если вы не хотите использовать литералы, вы можете использовать to_date()
или to_timestamp()
, используя подходящую явную маску формата. В любом случае, я бы порекомендовал вам использовать полные четырехзначные годы, а не двухзначные, что может привести к путанице (особенно при неявном преобразовании, но также легко легко ошибиться ...)