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