Przyczyna główna:
Konwertujesz NUMBER do STRING , zakładając, że jest to DATE . 20111010
to nie DATA, to NUMBER. Również '20111010'
to nie DATE, to STRING. Są zupełnie inne.
20111010
- LICZBA'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- DATA
Błąd:
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
Przechodząc do Twojego zapytania:
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')
Niepotrzebnie komplikujesz konwersję i formatowanie.
TIMESTAMP datatype to rozszerzenie w dniu DATE typ danych. Oprócz elementów datetime typu DATE, typ danych TIMESTAMP przechowuje ułamki sekundy z dokładnością od 0 do 9 miejsc po przecinku, domyślnie 6.
Ponieważ masz do czynienia z TIMESTAMP możesz użyć TO_TIMESTAMP .
Podczas wykonywania arytmetyki DATE/TIMESTAMP , należy pozostawić typ danych bez zmian i nie konwertować go na ciąg . Musisz użyć TO_CHAR tylko do wyświetlania .
Zmodyfikuj predykat filtra jako:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Powyżej, :fromDate
i :toDate
powinien być ciągiem a nie liczba .
Na przykład
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Lub użyj TO_CHAR do pierwszej konwersji liczba w ciąg :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM