SQL-Datum conversion-Ergebnisse zu "invalid number format" - Modell-parameter."
Ich select
einige Daten aus Oracle 11g
Datenbank, aber ich kann nicht scheinen, um herauszufinden, warum folgende select
Abfrage fehlschlägt:
SELECT
INFO_ID,
INFO_DETAIL,
IMPORTANT_FLG,
DELETE_FLG,
CREATE_TIME,
DISPLAY_ORDER
FROM TABLE_NAME
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')
ORDER BY IMPORTANT_FLG DESC NULLS LAST , DISPLAY_ORDER ASC NULLS LAST, CREATE_TIME DESC, INFO_ID ASC
Die Abfrage fehlschlägt, mit der folgenden Fehlermeldung:
ORA-01481: invalid number format model
01481. 00000 - "invalid number format model"
*Cause: The user is attempting to either convert a number to a string
via TO_CHAR or a string to a number via TO_NUMBER and has
supplied an invalid number format model parameter.
Meine Eingabe für die Variablen fromDate
und toDate
sind nur Datumsangaben wie 20111010
etc. Ich habe auch versucht mehr bestimmten Zeit (Gleiches format wie in der Tabelle), aber das scheint nicht das problem zu sein..
In der Datenbank der CREATE_TIME
Spalte ist TIMESTAMP(6)
geben, und zum Beispiel ein Beispiel ist 2011/12/19 08:04:42
Irgendwelche Ideen, warum dieser Fehler auftaucht?
Ich weiß nicht, PL/SQL (Oracle), aber Sie sollten in der Lage sein, um die Verwendung der ISO-8601 (
danke für die Anregung. Leider bekomme ich denselben Fehler auch schon mit Bindestrichen (ich habe versucht: ohne Bindestriche als Eingabe mit Bindestrichen als Eingabe, und auch die Striche für die TO_CHAR-parameter)
yyyy-MM-dd
) als format. Haben Sie versucht, mit Bindestrichen anstelle von Schrägstriche?danke für die Anregung. Leider bekomme ich denselben Fehler auch schon mit Bindestrichen (ich habe versucht: ohne Bindestriche als Eingabe mit Bindestrichen als Eingabe, und auch die Striche für die TO_CHAR-parameter)
TO_CHAR(:fromDate, 'YYYY/MM/DD')
ist falsch. Sie konvertieren eine ZAHL in STRING, vorausgesetzt, es DATE. 20111010
ist kein DATUM, es ist eine ZAHL. Auch '20111010'
ist kein DATUM, es ist ein STRING. Sie sind völlig anders.InformationsquelleAutor julumme | 2015-11-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ursache:
Sie konvertieren einer ANZAHL zu STRING, vorausgesetzt, es DATUM.
20111010
ist kein DATUM, es ist eine ZAHL. Auch'20111010'
ist kein DATUM, es ist ein STRING. Sie sind völlig anders.20111010
- ANZAHL'20111010'
- STRINGTO_DATE('20111010','YYYYMMDD')
- DATUMFehler:
Kommen, um Ihre Abfrage:
Sind Sie unnötig kompliziert, die Konvertierung und Formatierung.
Den TIMESTAMP Datentyp ist eine Erweiterung auf die DATUM Datentyp. Zusätzlich zu den datetime-Elemente der DATE-Datentyp TIMESTAMP Datentyp hält Bruchteilen einer Sekunde mit einer Genauigkeit zwischen 0 und 9 Nachkommastellen, Standard ist 6.
Da Sie es mit TIMESTAMP, die Sie nutzen könnten TO_TIMESTAMP.
Während einer DATUMS - /ZEITSTEMPEL arithmetische, verlassen Sie den Datentyp, wie er ist und nicht konvertieren es in string. Sie benötigenTO_CHAR nur für display.
Ändern Sie Ihre filter-Prädikat:
Oben
:fromDate
und:toDate
sollte ein string und nicht ein Anzahl.Beispielsweise
Oder verwenden Sie TO_CHAR zum ersten konvertieren die Anzahl in string:
InformationsquelleAutor Lalit Kumar B
Ich hoffe, diese Lösung hilft.
Gibt es zu viele unnötige Konvertierungen.
Habe ich simuliert, das gleiche Szenario in meinem system,
Hier
CREATED_TIME
ist eine Spalte vom Datentyptimestamp(6)
.ist hier die Antwort?
es ist vielleicht nicht die Antwort für Sie. Aber ich führte ihn in die richtige Richtung. Die Antwort ist zu einfach, nicht unnötige Dinge in SQL, halten Sie es einfach. Auch Sie haben die Antwort, wenn meine Antwort falsch war, die der OP hätte nie kommentiert meine Antwort richtig ist.
InformationsquelleAutor Jeethu