Kořenová příčina:
Převádíte NUMBER do STRING , za předpokladu, že je DATE . 20111010
není DATE, je to ČÍSLO. Také '20111010'
není DATE, je to STRING. Jsou úplně jiné.
20111010
– NUMBER'20111010'
– STRINGTO_DATE('20111010','YYYYMMDD')
– DATUM
Chyba:
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
Přecházíme k vašemu dotazu:
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')
Zbytečně komplikujete převod a formátování.
TIMESTAMP datový typ je rozšíření na DATE datový typ. Kromě prvků datetime datového typu DATE obsahuje datový typ TIMESTAMP zlomky sekundy s přesností mezi 0 a 9 desetinnými místy, výchozí hodnota je 6.
Protože máte co do činění s TIMESTAMP můžete použít TO_TIMESTAMP .
Při provádění aritmetiky DATE/TIMESTAMP , měli byste ponechat datový typ tak, jak je, a nepřevádět jej na řetězec . Musíte použít TO_CHAR pouze pro zobrazení .
Upravte predikát filtru jako:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Výše :fromDate
a :toDate
by měl být řetězec a nikoli číslo .
Například,
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Nebo použijte TO_CHAR nejprve převést číslo do řetězce :
SQL> SELECT to_timestamp(TO_CHAR(20111010), 'YYYYMMDD') FROM dual;
TO_TIMESTAMP(TO_CHAR(20111010),'YYYYMMDD')
------------------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM