Causa raiz:
Você está convertendo um NUMBER para STRING , supondo que seja DATE .
20111010
não é uma DATA, é um NÚMERO. Além disso, '20111010'
não é uma DATE, é uma STRING. Eles são completamente diferentes. 20111010
- NÚMERO'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- DATA
Erro:
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
Chegando à sua 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')
Você está complicando desnecessariamente a conversão e a formatação.
O TIMESTAMP tipo de dados é uma extensão em DATE tipo de dados. Além dos elementos datetime do tipo de dados DATE, o tipo de dados TIMESTAMP contém frações de segundo com precisão entre 0 e 9 casas decimais, sendo o padrão 6.
Como você está lidando com TIMESTAMP você pode usar TO_TIMESTAMP .
Ao fazer uma aritmética DATE/TIMESTAMP , você deve deixar o tipo de dados como está e não convertê-lo em string . Você precisa usarTO_CHAR apenas para exibir .
Modifique seu predicado de filtro como:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Acima,
:fromDate
e :toDate
deve ser uma string e não um número . Por exemplo,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Ou use TO_CHAR para primeiro converter o número em cadeia :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM