Root-årsag:
Du konverterer et NUMBER til STRING , forudsat at det er DATE . 20111010
er ikke en DATO, det er et NUMMER. Også '20111010'
er ikke en DATO, det er en STRING. De er helt forskellige.
20111010
- NUMBER'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- DATO
Fejl:
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 til din forespørgsel:
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 komplicerer konverteringen og formateringen unødigt.
TIMESTAMP datatype er en udvidelse på DATE datatype. Ud over datetime-elementerne i DATE-datatypen holder TIMESTAMP-datatypen brøkdele af et sekund med en præcision mellem 0 og 9 decimaler, standarden er 6.
Da du har med TIMESTAMP at gøre du kan bruge TO_TIMESTAMP .
Mens du laver en DATE/TIMESTAMP aritmetik , bør du lade datatypen være som den er og ikke konvertere den til streng . Du skal brugeTO_CHAR kun til visning .
Rediger dit filterprædikat som:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Ovenfor, :fromDate
og :toDate
skal være en streng og ikke et nummer .
For eksempel,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Eller brug TO_CHAR for først at konvertere nummeret ind i streng :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM