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