ORA-01843 - kein Gültiger Monat oracle SQL
Unten ich bin versucht zu ziehen Informationen aus einer oracle-Datenbank. Aber ich bekomme immer diese Fehlermeldung:
Warning: oci_execute(): ORA-01843: not a valid month
Warum ist mein code-publishing-dieser Fehler? TIA!
Code:
$objConnect = oci_connect("user", "password", "(description=(address=(protocol=tcp)(host=host)(port=1533))(connect_data=(service_name=sid)))");
$weekSQL2 = "SELECT * FROM INTOXDM.LSS_COP WHERE COP_WEEK = to_date('2014-08-06 00:00:00', 'yyyy-mm-dd HH24:MI:SS')";
$weekParse2 = oci_parse($objConnect, $weekSQL2);
$weekExecute2 = oci_execute($weekParse2);
$week2 = oci_fetch_all($weekParse2,$week12);
HINWEIS
Hier ist, was Daten so Aussehen wie in meiner Datenbank:
2014-06-23 00:00:00.0
Die verwirrt mich noch mehr, weil meine Formatierung ist genau das gleiche wie das, was in der Datenbank.
Was ist der Typ von
COP_WEEK
? Vielleicht das ist, wo Sie den Fehler.InformationsquelleAutor Ryan_W4588 | 2014-08-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die wahrscheinlichste Erklärung ist, dass
COP_WEEK
Spalte definiert ist, nicht alsDATE
, aber einige andere Datentyp (z.B. VARCHAR),Für die OP-Abfrage, Oracle Durchführung einer implizite Datentyp Konvertierung der Werte in die
COP_WEEK
Spalte, ausVARCHAR
zuDATE
. Die impliziteTO_DATE
Konvertierung mit format in den client angegebenNLS_DATE_FORMAT
variable, wahrscheinlich ist es die Standard -'DD-MON-RR'
. Was auch immer es ist, es muss nicht "passen", was in der Spalte gespeichert.Oder, wenn die NLS_DATE_FORMAT passt aber in die meisten der in der Spalte gespeicherten Werte, es gibt mindestens eine, die hat ein COP_WEEK Wert, der nicht mit dem format.
Einen code "fix" (ich setzte es in Anführungszeichen, weil es nicht wirklich Recht fix), ist die Konvertierung explizit, mit der TO_DATE Funktion:
Weitere option für ein code "fix" wäre ein Vergleich der nackten VARCHAR-Spalte in eine VARCHAR-literal
Dies hat den Vorteil, dass die Oracle um die Verwendung eines Indexes, anstatt dass eine Konvertierung für jede Zeile...
Eine bessere option wäre, um zu speichern COP_WEEK als DATE-Datentyp, anstatt eine VARCHAR -, aber das wäre mehr als eine änderung an Ihrem code.
COP_WEEK
ist einVARCHAR
, dann gibt es keine Notwendigkeit, zu konvertieren, alles zu einem Datum. Die beste option ist natürlich die Verwendung einer eigentlichenDATE
Datentyp.vereinbart. Ich habe vorschlagen, dass als eine mögliche code "fix". Ich ging mit der ausdrücklichen TO_DATE Konvertierung ersten; vor allem, weil das hilft erklären, warum die exception geworfen wird, mit dem vorhandenen Abfrage. Wir würden die gleichen Fehler mit expliziten TO_DATE wenn der supplie Ort-format nicht mit dem übereinstimmt, wird mindestens ein Wert in dieser Spalte gespeichert werden.
Vielen Dank für die Hilfe, ich habe gerade endete Sie es von einem
DATE
DatentypVARCHAR
denn ich war zu verwirrt, hahaInformationsquelleAutor spencer7593