Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die Ergebnisse der SQL-Datumskonvertierung ergeben einen ungültigen Modellparameter für das Zahlenformat.

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' - STRING
  • TO_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