Ich versuche, das aktuelle Datum und die Uhrzeit in eine Variable in der MS-SQL-Datenbank einzufügen .. __ Ich verwende dieses Format:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
Calendar cal = Calendar.getInstance();
System.out.println(dateFormat.format(cal.getTime()));
und ich bekomme dies als Ergebnis 2013-01-28 09: 29: 37.941
Mein Feld in der Datenbank ist datetime
definiert, und wie ich in anderen Tabellen gesehen habe, die das gleiche Feld haben, werden Datum und Uhrzeit genauso geschrieben wie diese 2011-07-05 14: 18: 33.000.
Ich versuche, mit einer Abfrage, die ich in einem Java-Programm durchführe, in die Datenbank einzufügen, aber ich erhalte diesen Fehler
SQL-Ausnahme: Status: S0003 Nachricht: Die Konvertierung eines varchar-Befehls Datentyp zu einem Datetime-Datentyp des Werts ist außerhalb des Bereichs. Error : 242
Meine Frage ist so:
query = "INSERT INTO Companies CreatedOn"+
"VALUES ('" + dateFormat.format(cal.getTime()) + "')"
aber ich verstehe nicht, was ich falsch mache.
Entsprechend der Fehlerbeschreibung fügen Sie einen falschen Typ in die Datenbank ein. Siehe JDBC to MSSQL . Sie sollten Kalender in Zeitstempel konvertieren.
Versuchen Sie es mit:
PrepareStatement statement
= connection.prepareStatement("INSERT INTO Companies CreatedOn VALUES(?)");
Java.sql.Timestamp timestamp = new Java.sql.Timestamp(cal.getTimeInMillis());
statement.setTimestamp(1, timstamp);
int insertedRecordsCount = statement.executeUpdate();
Verwenden Sie zunächst KEINE String-Verkettung. Haben Sie jemals ein Herz von SQL Injection ?
Um dies richtig zu machen, verwenden Sie die vorbereitete Anweisung:
Die Idee ist, Sie definieren eine Anweisung mit Platzhaltern und definieren dann einen Wert für diese Platzhalter.
Siehe @Taky ' s answer für weitere Details.
dateFormat#format
Diese Methode gibt eine formatierte Zeichenfolge und kein Date
-Objekt zurück. Das Datenbankfeld ist DateTime
und erwartet, dass dort Java.sql.Timestamp
und nicht String
gemäß docs eingefügt wird.
Um mit der Definition von SQL DATE übereinzustimmen, sind die Millisekundenwerte Umhüllt von einer Java.sql.Date-Instanz muss durch die Einstellung von .__ "normalisiert" werden. Stunden, Minuten, Sekunden und Millisekunden in bestimmte Zeitzone, der die Instanz zugeordnet ist.
Versuchen Sie ein Java.sql.Timestamp
-Objekt anstelle von String in der Abfrage. Ich würde empfehlen, PreparedStatement
zu verwenden.
Wenn Sie das aktuelle Datum und die aktuelle Uhrzeit speichern möchten, sollten Sie MYSQL eingebaute Methode NOW (). Verwenden. Kurzdokumentation finden Sie unter http: //dev.mysql .com/doc/refman/5.5/de/Datums- und Zeitfunktionen.html . Ihr Code wird also so sein.
INSERT INTO Companies CreatedOn VALUES(NOW())"
Wenn Sie jedoch Java Date-util verwenden möchten, sollte dies der Fall sein
Calendar cal = Calendar.getInstance();
Java.sql.Timestamp timestamp = new Timestamp(cal.getTimeInMillis());
Sie könnten Joda framework verwenden, um mit date/time ..__ zu arbeiten. Es ordnet Hibernate/SQL-Typen problemlos ihre eigenen Datums-/Zeit-Typen zu. Wenn Sie in HQL Parameter setzen, führt joda eine richtige Typzuordnung durch .
Dies liegt daran, dass Sie versuchen, den String-Datumswert im Feld "Datumstyp-DB" zu speichern.
konvertieren Sie es in Data DataType
Sie können auch das Format datetime "unseparated" verwenden. yyyymmdd hh:mm:ss