So speichern Sie Java Date in Mysql datetime mit JPA

104

Kann mir jemand sagen, wie ich Java Date in MySQL datetime speichern kann ...?

Wenn ich das versuche ... wird nur das Datum gespeichert und die Uhrzeit bleibt in MySQL-Datumsgeschäften wie diesem 00:00:00 ...

2009-09-22 00:00:00

Ich möchte nicht nur Datum, sondern auch Uhrzeit ... wie

2009-09-22 08:08:11

Ich verwende JPA (Hibernate) mit Spring Mydomain-Klassen verwendet java.util.Date, aber ich habe Tabellen mit handschriftlichen Abfragen erstellt ...

Dies ist meine create-Anweisung

CREATE TABLE ContactUs (id BIGINT auto_increment, 
                        userName VARCHAR(30), 
                        email VARCHAR(50), 
                        subject VARCHAR(100), 
                        message VARCHAR(1024), 
                        messageType VARCHAR(15), 
                        contactUsTime datetime, 
                        primary key(id))
                        TYPE=InnoDB;
Urvish
quelle
Teile Ihres Codes vielleicht?
Bozho
1
Heutzutage sollten Sie überhaupt nicht mehr verwenden java.util.Date(2010 gab es wahrscheinlich keine bessere Wahl). Verwenden Sie besser die modernen Klassen wie java.time.Instantoder java.time.LocalDateTime, abhängig von den genauen Anforderungen für das Datum und die Uhrzeit, die Sie speichern müssen.
Ole VV
Einige dieser alten Antworten sind in Google-Rankings ziemlich hoch. In Java 8+ können wir einfach LocalDateTime verwenden, um datetime zu speichern, anstatt @Temporal zu verwenden, um im datetime-Format zu speichern
HopeKing
prepareStatement.setTimestamp (1, neuer Zeitstempel (System.currentTimeMillis ()));
Rajat

Antworten:

164

siehe im Link:

http://www.coderanch.com/t/304851/JDBC/java/Java-date-MySQL-date-conversion

Der folgende Code hat das Problem gerade gelöst:

java.util.Date dt = new java.util.Date();

java.text.SimpleDateFormat sdf = 
     new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String currentTime = sdf.format(dt);

Diese ' currentTime ' wurde in die Spalte mit dem Typ DateTime eingefügt und war erfolgreich.

Haim Evgi
quelle
4
Aber currentTime ist ein String-Objekt, und in db nehmen wir datetime als Datentyp. Ich denke, es wird nicht eingefügt.
Reddy
yyyy-MM-dd HH:mm:ssist sehr wichtig. Beachten Sie die Großschreibung.
Biniam
91

Kommentieren Sie Ihr Feld (oder Ihren Getter) folgendermaßen @Temporal(TemporalType.TIMESTAMP):

public class MyEntity {
    ...
    @Temporal(TemporalType.TIMESTAMP)
    private java.util.Date myDate;
    ...
}

Das sollte den Trick machen.

Pascal Thivent
quelle
2
Dies ist in der Tat die Antwort!
Perneel
2
Dies ist die richtige Antwort.
Ryan
3
Beachten Sie, dass bei Auswahl dieser Lösung Ihr Datum beim Abrufen von db als Zeitstempel angezeigt wird. Es wird nicht die schöne Formatierung 'JJJJ-MM-TT ....') haben
Jon
37

Benutzt du vielleicht java.sql.Date? Während dies als Java-Klasse eine Millisekunden-Granularität aufweist (es ist eine Unterklasse einer java.util.Dateschlechten Entwurfsentscheidung), wird es vom JDBC-Treiber als Datum ohne Zeitkomponente interpretiert. Sie müssen java.sql.Timestampstattdessen verwenden.

Michael Borgwardt
quelle
1
Ich würde nicht java.sql.Dateoder java.sql.Timestampin Domain-Klassen verwenden, aber ich denke, dies wurde vor der Bearbeitung des OP geschrieben.
Pascal Thivent
Ich würde. java.util.Date-Objekte lassen sich nicht mit java.sql.Timestamp-Objekten mit vollständig vorhersehbaren Ergebnissen vergleichen.
Doug Moscrop
8

Wahrscheinlich, weil Ihr Java-Datum ein anderes Format hat als mysql format( YYYY-MM-DD HH:MM:SS)

mach das

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Marcx
quelle
Sie haben das richtige Format in der Referenz erwähnt und dann das falsche Format im Code verwendet.
Merric Huffstutler
6

Sie erhalten das Zeitformat 2011-07-18 +

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);
Anuj
quelle
5

mysql datetime -> GregorianCalendar

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = format.parse("2012-12-13 14:54:30"); // mysql datetime format
GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(date);
System.out.println(calendar.getTime());

GregorianCalendar -> mysql datetime

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String string = format.format(calendar.getTime());
System.out.println(string);
Nikopol
quelle
4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);
michdraft
quelle
1

Verwenden Sie den folgenden Code, um das Datum in MySQL einzufügen. Anstatt das Format unseres Datums zu ändern, um die Anforderungen von MySql zu erfüllen, können wir der Datenbank helfen, unser Datum zu erkennen, indem wir die STR_TO_DATE(?, '%l:%i %p')Parameter festlegen .

Beispielsweise kann der 12.03.2014 als dargestellt werden STR_TO_DATE('2014-03-12', '%Y-%m-%d')

preparedStatement = connect.prepareStatement("INSERT INTO test.msft VALUES (default, STR_TO_DATE( ?, '%m/%d/%Y'), STR_TO_DATE(?, '%l:%i %p'),?,?,?,?,?)"); 
Yang_2333
quelle
1

Es ist sehr einfach, obwohl die Bedingungen in dieser Antwort in MySQL sind. Der Spaltendatentyp ist Datumszeit und Sie möchten Daten vom Java-Code an MySQL senden:

java.util.Date dt = new java.util.Date ();
whatever your code object may be.setDateTime (dt);

Wichtig ist nur, dass Sie das Datum auswählen und das Format bereits dem MySQL-Format entspricht, und es senden, ohne dass weitere Änderungen erforderlich sind.

Yash Agrawal
quelle
0

Tatsächlich können Sie SimpleDateFormat nicht verwenden. Sie können so etwas verwenden.

  @JsonSerialize(using=JsonDateSerializer.class)
  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/MM/yyyy HH:mm:ss")
  private Date blkDate;

Auf diese Weise können Sie das Datum direkt mit dem angegebenen Format abrufen.

Sahin Yanlık
quelle
0

Ich bevorzuge immer noch die Methode in einer Zeile

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())
Mohannd
quelle
-2

Für mich geht das !!

in MySQL-Tabelle

DATETIME

in Entität:

private Date startDate;

in Bearbeitung:

objectEntity.setStartDate(new Date());

in vorbereitetem Statement:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Miguel Alonso Mosquera Aguilar
quelle