Für diese einfache INSERTAnweisung spielt es keine Rolle , aber im Allgemeinen möchten Sie solche Bindungsvariablen nicht verwenden. Die Typkonvertierung in Ihrer ersten Anweisung verhindert, dass sie bindungsempfindlich ist, was die Fähigkeit von Oracle einschränkt, gute Pläne zu erstellen. Das Optimierungsprogramm funktioniert möglicherweise besser, wenn Sie values (:ts_val)stattdessen Folgendes verwenden: ts_val wird direkt einem Zeitstempel zugeordnet.
Jon Heller
@ JonHeller Können Sie ein konkretes Beispiel dafür zeigen, wie die Verwendung to_timestampeinen schlechten Ausführungsplan für eine planbare SQL-Anweisung verursachen würde? Ich kann ein Beispiel zeigen, wie es nicht wäre. Ich denke, wir alle möchten stattdessen unerwarteten Datentypzwang vermeiden , der die Verwendung einer erwarteten Zeilenquellenoperation (dh der optimalen) ausschließt.
Jeff Holt
@ jeff6times7 In dieser Übersicht finden Sie eine Erklärung, wie nicht konvertierte Bindevariablen konvertierte Bindevariablen übertreffen können. Der Unterschied ist wahrscheinlich nur wichtig, wenn die Daten verzerrt sind. Mit nativen Bindungstypen kann Oracle die Daten besser verstehen und basierend auf den Werten bessere Schätzungen vornehmen.
Die Art hängt davon ab, woher der Wert kommt, den Sie einfügen möchten. Wenn Sie die aktuelle Uhrzeit einfügen möchten, können Sie diese CURRENT_TIMESTAMPwie in anderen Antworten (oder SYSTIMESTAMP) gezeigt verwenden.
Wenn Sie eine Zeit als Zeichenfolge haben und diese in einen Zeitstempel konvertieren möchten, verwenden Sie einen Ausdruck wie
Ich hoffe, dass die Zeitformatkomponenten selbsterklärend sind, außer dass FF3 dies 3 Stellen mit einer Genauigkeit von weniger als einer Sekunde bedeutet. Sie können eine Genauigkeit von bis zu 6 Stellen erreichen.
Wenn Sie aus einer Anwendung einfügen, hängt die beste Antwort möglicherweise davon ab, wie der Datums- / Uhrzeitwert in Ihrer Sprache gespeichert ist. Sie können beispielsweise bestimmte Java-Objekte direkt einer TIMESTAMPSpalte zuordnen, müssen jedoch die JDBCTypzuordnungen verstehen .
Oracle 11. Feld definiert als TIMESTAMP (6) nicht NULL. Mit timestamp '2019-05-16 10:05:51:19:277401'Ich habe diesen Fehler: ORA-01882: Zeitzonenregion nicht gefunden
Antworten:
Wenn Sie möchten, dass der aktuelle Zeitstempel eingefügt wird, gehen Sie wie folgt vor:
quelle
TO_DATE
stattTO_TIMESTAMP
?INSERT
Anweisung spielt es keine Rolle , aber im Allgemeinen möchten Sie solche Bindungsvariablen nicht verwenden. Die Typkonvertierung in Ihrer ersten Anweisung verhindert, dass sie bindungsempfindlich ist, was die Fähigkeit von Oracle einschränkt, gute Pläne zu erstellen. Das Optimierungsprogramm funktioniert möglicherweise besser, wenn Sievalues (:ts_val)
stattdessen Folgendes verwenden: ts_val wird direkt einem Zeitstempel zugeordnet.to_timestamp
einen schlechten Ausführungsplan für eine planbare SQL-Anweisung verursachen würde? Ich kann ein Beispiel zeigen, wie es nicht wäre. Ich denke, wir alle möchten stattdessen unerwarteten Datentypzwang vermeiden , der die Verwendung einer erwarteten Zeilenquellenoperation (dh der optimalen) ausschließt.CURRENT_TIMESTAMP
undSYSTIMESTAMP
sind Oracle reservierte Wörter für diesen Zweck. Sie sind das Zeitstempelanalog vonSYSDATE
.quelle
quelle
Die Art hängt davon ab, woher der Wert kommt, den Sie einfügen möchten. Wenn Sie die aktuelle Uhrzeit einfügen möchten, können Sie diese
CURRENT_TIMESTAMP
wie in anderen Antworten (oderSYSTIMESTAMP
) gezeigt verwenden.Wenn Sie eine Zeit als Zeichenfolge haben und diese in einen Zeitstempel konvertieren möchten, verwenden Sie einen Ausdruck wie
Ich hoffe, dass die Zeitformatkomponenten selbsterklärend sind, außer dass
FF3
dies 3 Stellen mit einer Genauigkeit von weniger als einer Sekunde bedeutet. Sie können eine Genauigkeit von bis zu 6 Stellen erreichen.Wenn Sie aus einer Anwendung einfügen, hängt die beste Antwort möglicherweise davon ab, wie der Datums- / Uhrzeitwert in Ihrer Sprache gespeichert ist. Sie können beispielsweise bestimmte Java-Objekte direkt einer
TIMESTAMP
Spalte zuordnen, müssen jedoch dieJDBC
Typzuordnungen verstehen .quelle
Ich bevorzuge ANSI-Zeitstempel-Literale:
Weitere Details im Handbuch: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062
quelle
timestamp '2019-05-16 10:05:51:19:277401'
Ich habe diesen Fehler: ORA-01882: Zeitzonenregion nicht gefundenDatum in SQL einfügen
Angenommen, wir wollten das Systemdatum einfügen
quelle
Zuerst müssen Sie das Feld auf Null setzen, danach so einfach - anstatt einen Wert einzugeben, geben Sie diesen Code ein
CURRENT_TIMESTAMP
.quelle
Für meine eigene zukünftige Referenz:
Verwenden Sie mit cx_Oracle cursor.setinputsize (...):
Keine Konvertierung in der Datenbank erforderlich. Siehe Oracle-Dokumentation
quelle
Man kann es einfach benutzen
Auf diese Weise müssen Sie sich keine Gedanken über die Zeichenfolge im Datumsformat machen. Verwenden Sie einfach das Standard-Zeitstempelformat.
Funktioniert mit Oracle 11, habe keine Ahnung, ob dies für frühere Oracle-Versionen der Fall ist.
quelle
Dies funktioniert für MSSQL 2012
quelle