Rootorsak:
Du konverterar ett NUMBER till STRING , förutsatt att det är DATE . 20111010 är inte ett DATUM, det är ett NUMMER. Även '20111010' är inte ett DATUM, det är ett STRING. De är helt olika.
20111010- NUMBER'20111010'- STRINGTO_DATE('20111010','YYYYMMDD')- DATE
Fel:
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
Kommer till din fråga:
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')
Du komplicerar omvandlingen och formateringen i onödan.
TIMESTAMP datatype är ett tillägg på DATE data typ. Utöver datetime-elementen i DATE-datatypen, innehåller TIMESTAMP-datatypen bråkdelar av en sekund med en precision mellan 0 och 9 decimaler, standard är 6.
Eftersom du har att göra med TIMESTAMP du kan använda TO_TIMESTAMP .
När du gör en DATE/TIMESTAMP aritmetik , bör du lämna datatypen som den är och inte konvertera den till sträng . Du måste användaTO_CHAR endast för visning .
Ändra ditt filterpredikat som:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Ovan, :fromDate och :toDate ska vara en sträng och inte ett nummer .
Till exempel,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Eller använd TO_CHAR för att först konvertera numret till sträng :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM