Oracle: Insert Timespamp (kein gültiger Monat)?

1 Antwort

Du trennst deine Parameter für die Funktion nicht voneinander ab. Es sollte so aussehen:

TO_TIMESTAMP('2825-10-17-15.51.13.401018', 'YYYY-MM-DD-HH24.MI.SS.FF')

Timolo92 
Fragesteller
 19.12.2019, 17:36

Hallo regex9, vielen Dank erstmal. Das hat zwar funktioniert, doch wie kriege ich dieses Format des Timestamps in Oracle rein OHNE eine Formatierung vorzunehmen ? Ich kann zwar beispielesweise in Oracle SQL Developer einen Default-Format vorgeben, wo ich dann keine Formatierung beim Insert vornehmen muss, allerdings werden die Daten (viele Daten) durch Java in Oracle geschrieben und es sollte keine Formatierung (aufgrund von Peformance etc.) stattfinden. In DB2 gehen die Daten ohne Formatierung rein. Kann ich evtl. an den Tabellenspalten Änderungen vornehmen, um die Formatierung zu umgehen ?

0
regex9  19.12.2019, 18:58
@Timolo92

Optimal sollte es sein, wenn die Daten bereits als Timestamp vorliegen, denn dann kann das Parsing auf Seiten der Datenbank eingespart werden. Letzten Endes ist der Formatter ja auch nur dazu da.

Bei Db2 gibt es, wenn ich mich richtig erinnere, vordefinierte Formate. Wenn eines erfüllt wird, kann das System implizit erfolgreich parsen.

0
Timolo92 
Fragesteller
 19.12.2019, 19:50
@regex9

Danke erstmal. Mich würde dennoch interessieren wieso ich beim Insert von 2825-08-17-15.51.13.400067 mit dem Format YYYY-MM-DD hh:mm:ss die Meldung bekomme, dass es sich um keinen gültigen Monat handelt. Der Monat ist hier 08! Wieso also nicht gültig ? Kann ich nicht nachvollziehen. Ich schätze über Java wird default das selbe Format verwendet, weshalb ich auch dort die Meldung bekomme...

0
regex9  19.12.2019, 20:26
@Timolo92

In diesem Fall sieht das Format falsch aus:

YYYY-MM-DD hh:mm:ss
2825-08-17-15.51.13.400067

Das in deiner obigen Fragestellung verwendete Format sollte eher passen.

0
Timolo92 
Fragesteller
 19.12.2019, 21:15
@regex9

Dass das Format falsch ist, weiß ich. Allerdings hätte ich eine andere Fehlermeldung erwartet, da das mit dem Monat ja dennoch passt (der Rest dann nicht mehr ganz). Derzeit habe ich das Problem, dass ich über das Insert-Statement über Java nur einen Timestamp reinbebomme, wenn ich dies vorher formatiere, sonst nicht. Da Frage ich mich im welchem Format Oracle das dann standardmäßig erwartet. Über Oracle SQL Developer gebe ich das Format im NLS ja an...

0
regex9  20.12.2019, 00:48
@Timolo92

Warum ausgerechnet diese Fehlermeldung kommt, kann ich dir nicht sagen.

In Java sollte das Verfahren eigentlich ungefähr so aussehen:

String sqlQuery = "insert into Tab (col) values (?)";

PreparedStatement statement = connection.prepareStatement(sqlQuery);
statement.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
ResultSet result = statement.executeQuery();
0
vorhautloser641  28.10.2020, 17:52
@vorhautloser641
du musst einmalig, nachdem die Connection geöffnet hast, folgende ORACLE Procedure per jdbc ausrufen um das Format zu setzen, so in etwa, kann es jetzt nicht testen: 

CallableStatement cStmt = conn.prepareCall("{call DBMS_SESSION.SET_NLS('nls_timestamp_format','''YYYY-MM-DD "T"HH24:MI:SS''')}");
0