Grundursache:
Sie konvertieren eine NUMBER zu STRING , vorausgesetzt, es ist DATE . 20111010
ist kein DATUM, sondern eine ZAHL. Auch '20111010'
ist kein DATE, sondern ein STRING. Sie sind völlig unterschiedlich.
20111010
- ZAHL'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- DATUM
Fehler:
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
Zu Ihrer Frage kommend:
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')
Sie machen die Konvertierung und Formatierung unnötig kompliziert.
Der ZEITSTEMPEL datatype ist eine Erweiterung des DATE Datentyp. Zusätzlich zu den datetime-Elementen des DATE-Datentyps enthält der TIMESTAMP-Datentyp Sekundenbruchteile mit einer Genauigkeit zwischen 0 und 9 Dezimalstellen, wobei der Standardwert 6 ist.
Da Sie es mit TIMESTAMP zu tun haben Sie könnten TO_TIMESTAMP verwenden .
Beim Durchführen einer DATE/TIMESTAMP-Arithmetik , sollten Sie den Datentyp so lassen wie er ist und ihn nicht in String umwandeln . Sie müssen TO_CHAR verwenden nur für Display .
Ändern Sie Ihr Filterprädikat wie folgt:
WHERE CREATE_TIME
BETWEEN TO_TIMESTAMP(:fromDate, 'YYYY/MM/DD')
AND TO_TIMESTAMP(:toDate, 'YYYY/MM/DD')
Oben :fromDate
und :toDate
sollte ein String sein und keine Zahl .
Zum Beispiel
SQL> SELECT to_timestamp('20111010', 'YYYYMMDD') FROM dual;
TO_TIMESTAMP('20111010','YYYYMMDD')
-----------------------------------------------------------
10-OCT-11 12.00.00.000000000 AM
Oder verwenden Sie TO_CHAR zuerst konvertieren die Nummer in 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