Causa raíz:
Estás convirtiendo un NUMBER a STRING , suponiendo que sea FECHA . 20111010
no es una FECHA, es un NUMERO. Además, '20111010'
no es una FECHA, es una CADENA. Son completamente diferentes.
20111010
- NÚMERO'20111010'
- CADENATO_DATE('20111010','YYYYMMDD')
- FECHA
SQL> SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual;
SELECT TO_CHAR(20111010, 'YYYY/MM/DD') FROM dual
*
ERROR at line 1:
ORA-01481: invalid number format model
En cuanto a su consulta:
WHERE TO_DATE(TO_CHAR(CREATE_TIME, 'YYYY/MM/DD'), 'YYYY/MM/DD')
BETWEEN TO_DATE(TO_CHAR(:fromDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
AND TO_DATE(TO_CHAR(:toDate, 'YYYY/MM/DD'), 'YYYY/MM/DD')
Está complicando innecesariamente la conversión y el formateo.
La MARCA DE TIEMPO tipo de datos es una extensión en el FECHA tipo de datos. Además de los elementos de fecha y hora del tipo de datos DATE, el tipo de datos TIMESTAMP contiene fracciones de segundo con una precisión de entre 0 y 9 decimales, siendo 6 el valor predeterminado.
Dado que se trata de TIMESTAMP podrías usar TO_TIMESTAMP .
Mientras hace una aritmética de FECHA/TIMESTAMP , debe dejar el tipo de datos como está y no convertirlo en cadena . Necesitas usar TO_CHAR solo para pantalla .
Modifique su predicado de filtro como:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Arriba, :fromDate
y :toDate
debe ser una cadena y no un número .
Por ejemplo,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
O utilice TO_CHAR primero convertir el número en cadena :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM