Първопричина:
Преобразувате NUMBER до STRING , като приемем, че е ДАТА . 20111010
не е ДАТА, а ЧИСЛО. Освен това, '20111010'
не е ДАТА, а STRING. Те са напълно различни.
20111010
- БРОЙ'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- ДАТА
Грешка:
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
Стигаме до вашето запитване:
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')
Вие ненужно усложнявате конвертирането и форматирането.
TIMESTAMP datatype е разширение на ДАТА тип данни. В допълнение към елементите за дата и час от типа данни DATE, типът данни TIMESTAMP съдържа части от секундата с точност между 0 и 9 знака след десетичната запетая, като по подразбиране е 6.
Тъй като имате работа с TIMESTAMP можете да използвате TO_TIMESTAMP .
Докато извършвате аритметика за ДАТА/ЧАСОВ ПЕЧАТ , трябва да оставите типа данни такъв, какъвто е и да не го конвертирате в низ . Трябва да използватеTO_CHAR само задисплей .
Променете вашия предикат за филтър като:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
По-горе, :fromDate
и :toDate
трябва да бъде низ а не номерната .
Например,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Или използвайте TO_CHAR за първо конвертиране номерната в низ :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM