Вы сейчас делаете это:
NVL(SUM(DECODE(TO_DATE(BT.FECHA_INFORMACION,'DD/MM/YYYY'),vFECHA1,SDO_PUNTUAL)),0)
, который, как обсуждалось в комментариях, не должен применяться TO_DATE()
к чему-то, что уже является датой, поэтому вам нужно либо:
NVL(SUM(DECODE(BT.FECHA_INFORMACION,vFECHA1,SDO_PUNTUAL)),0)
, как вы делаете для сравнений, или если FECHA_INFORMACION
имеет значения с отрезками времени, отличными от полуночи:
NVL(SUM(DECODE(TRUNC(BT.FECHA_INFORMACION),vFECHA1,SDO_PUNTUAL)),0)
Функция TRUNC()
по умолчанию устанавливает для части времени значение полуночи, поэтому все значения для дня получают одно и то же значение даты и времени. Если ID_FECHA
также имеет не полуночное время, то вы можете обрезать и эти переменные, хотя из контакта это выглядит менее наглядно:
NVL(SUM(DECODE(TRUNC(BT.FECHA_INFORMACION),TRUNC(vFECHA1),SDO_PUNTUAL)),0)
Вы также можете по умолчанию установить нулевое значение при декодировании, но в этом случае это не должно иметь большого значения.
Без TO_DATE()
и его неявного TO_CHAR()
настройки NLS не имеют значения, поскольку вы сравниваете даты с другими датами. Oracle использует внутреннее представление, которое не имеет ничего общего с тем, как ваш клиент отображает даты в виде строк.
Возможно, у вас также есть проблема с этим:
WHERE BT.FECHA_INFORMACION IN (vFECHA1, vFECHA2, vFECHA3, vFECHA4, vFECHA5, vFECHA6)
, поскольку это будет совпадать только в полночь. Вы также можете обрезать это:
WHERE TRUNC(BT.FECHA_INFORMACION) IN (vFECHA1, vFECHA2, vFECHA3, vFECHA4, vFECHA5, vFECHA6)
снова, предполагая, что FECHA_INFORMACION
имеет не полуночное время, а все переменные находятся в полночь. Это предотвратит использование FECHA_INFORMACION
, но вместо этого вы можете переключиться для сравнения нескольких диапазонов. Посмотрим, решит ли это проблему в первую очередь.