Hoofdoorzaak:
U converteert een NUMBER naar STRING , ervan uitgaande dat het DATE is . 20111010 is geen DATUM, het is een NUMMER. Ook '20111010' is geen DATUM, het is een STRING. Ze zijn compleet anders.
20111010- NUMMER'20111010'- STRINGTO_DATE('20111010','YYYYMMDD')- DATUM
Fout:
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
Komt op uw vraag:
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')
U maakt de conversie en opmaak onnodig ingewikkeld.
De TIMESTAMP datatype is een extensie op de DATE data type. Naast de datetime-elementen van het datatype DATE, bevat het datatype TIMESTAMP fracties van een seconde tot een precisie tussen 0 en 9 decimalen, waarbij de standaardwaarde 6 is.
Aangezien je te maken hebt met TIMESTAMP je zou TO_TIMESTAMP . kunnen gebruiken .
Tijdens een DATE/TIMESTAMP-berekening , moet u het gegevenstype laten zoals het is en het niet converteren naar string . U moetTO_CHAR . gebruiken alleen voor weergave .
Wijzig uw filterpredikaat als:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Hierboven, :fromDate en :toDate moet een tekenreeks . zijn en niet een nummer .
Bijvoorbeeld,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Of gebruik TO_CHAR eerst converteren het nummer in tekenreeks :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM