Wie füge ich einen Zeitstempel in Oracle ein?

91

Ich habe eine Oracle-Datenbank mit einem timestampFeld darin. Was ist der richtige SQL-Code, um ein timestampin dieses Feld einzufügen ?

Mike Rifgin
quelle
9
"Ich kann diese Informationen nirgendwo finden." Die Oracle-Dokumentation ist umfassend und online. Finden Sie es hier: download.oracle.com/docs/cd/B19306_01/server.102/b14200/toc.htm
APC

Antworten:

135
insert
into tablename (timestamp_value)
values (TO_TIMESTAMP(:ts_val, 'YYYY-MM-DD HH24:MI:SS'));

Wenn Sie möchten, dass der aktuelle Zeitstempel eingefügt wird, gehen Sie wie folgt vor:

insert
into tablename (timestamp_value)
values (CURRENT_TIMESTAMP);
Reggie
quelle
1
Warum TO_DATEstatt TO_TIMESTAMP?
Dave Costa
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.
Jon Heller
24
INSERT
INTO    mytable (timestamp_field)
VALUES  (CURRENT_TIMESTAMP)

CURRENT_TIMESTAMPund SYSTIMESTAMPsind Oracle reservierte Wörter für diesen Zweck. Sie sind das Zeitstempelanalog von SYSDATE.

Quassnoi
quelle
19
INSERT INTO TABLE_NAME (TIMESTAMP_VALUE) VALUES (TO_TIMESTAMP('2014-07-02 06:14:00.742000000', 'YYYY-MM-DD HH24:MI:SS.FF'));
Kash
quelle
9

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

to_timestamp(:timestamp_as_string,'MM/DD/YYYY HH24:MI:SS.FF3')

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 .

Dave Costa
quelle
4

Ich bevorzuge ANSI-Zeitstempel-Literale:

insert into the_table 
  (the_timestamp_column)
values 
  (timestamp '2017-10-12 21:22:23');

Weitere Details im Handbuch: https://docs.oracle.com/database/121/SQLRF/sql_elements003.htm#SQLRF51062

ein Pferd ohne Name
quelle
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
Alex 75
1

Datum in SQL einfügen

insert
into tablename (timestamp_value)
values ('dd-mm-yyyy hh-mm-ss AM');

Angenommen, wir wollten das Systemdatum einfügen

insert
into tablename (timestamp_value)
values (sysdate);
Sai Krishna
quelle
0

Zuerst müssen Sie das Feld auf Null setzen, danach so einfach - anstatt einen Wert einzugeben, geben Sie diesen Code ein CURRENT_TIMESTAMP.

Ahuramazda
quelle
0

Für meine eigene zukünftige Referenz:

Verwenden Sie mit cx_Oracle cursor.setinputsize (...):

mycursor = connection.cursor();

mycursor.setinputsize( mytimestamp=cx_Oracle.TIMESTAMP );
params = { 'mytimestamp': timestampVar };
cusrsor.execute("INSERT INTO mytable (timestamp_field9 VALUES(:mytimestamp)", params);

Keine Konvertierung in der Datenbank erforderlich. Siehe Oracle-Dokumentation

Mario der Löffel
quelle
0

Man kann es einfach benutzen

INSERT INTO MY_TABLE(MY_TIMESTAMP_FIELD)
VALUES (TIMESTAMP '2019-02-15 13:22:11.871+02:00');

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.

Sonst
quelle
-6
CREATE TABLE Table1 (
id int identity(1, 1) NOT NULL,
Somecolmn varchar (5),
LastChanged [timestamp] NOT NULL)

Dies funktioniert für MSSQL 2012

INSERT INTO Table1 VALUES('hello',DEFAULT)  
VGuest
quelle