Causa principale:
Stai convertendo un NUMERO a STRING , supponendo che sia DATE . 20111010
non è una DATA, è un NUMERO. Inoltre, '20111010'
non è una DATA, è una STRINGA. Sono completamente diversi.
20111010
- NUMERO'20111010'
- STRINGATO_DATE('20111010','YYYYMMDD')
- DATA
Errore:
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
Venendo alla tua domanda:
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')
Stai complicando inutilmente la conversione e la formattazione.
Il TIMESTAMP datatype è un'estensione del DATE tipo di dati. Oltre agli elementi datetime del tipo di dati DATE, il tipo di dati TIMESTAMP contiene frazioni di secondo con una precisione compresa tra 0 e 9 cifre decimali, il valore predefinito è 6.
Dal momento che hai a che fare con TIMESTAMP potresti usare TO_TIMESTAMP .
Durante l'esecuzione di DATA/TIMESTAMP aritmetica , dovresti lasciare il tipo di dati così com'è e non convertirlo in string . Devi usareTO_CHAR solo per visualizzazione .
Modifica il predicato del filtro come:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Sopra, :fromDate
e :toDate
dovrebbe essere una stringa e non un numero .
Ad esempio,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Oppure usa TO_CHAR per prima convertire il numero in stringa :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM