Akar Penyebab:
Anda mengonversi NUMBER ke STRING , dengan asumsi tanggal TANGGAL . 20111010
bukan DATE, itu NUMBER. Juga, '20111010'
bukan DATE, itu STRING. Mereka benar-benar berbeda.
20111010
- NUMBER'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- TANGGAL
Kesalahan:
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
Datang ke kueri Anda:
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')
Anda tidak perlu memperumit konversi dan pemformatan.
TIMESTAMP tipe data adalah ekstensi pada TANGGAL tipe data. Selain elemen datetime dari tipe data DATE, tipe data TIMESTAMP menyimpan sepersekian detik hingga presisi antara 0 dan 9 tempat desimal, defaultnya adalah 6.
Karena Anda berurusan dengan TIMESTAMP Anda dapat menggunakan TO_TIMESTAMP .
Saat melakukan aritmatika DATE/TIMESTAMP , Anda harus membiarkan tipe data apa adanya dan tidak mengubahnya menjadi string . Anda perlu menggunakanTO_CHAR hanya untuk tampilan .
Ubah predikat filter Anda sebagai:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Di atas, :fromDate
dan :toDate
harus berupa string dan bukan angka .
Misalnya,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Atau, gunakan TO_CHAR untuk mengkonversi first pertama angka menjadi string :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM