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;

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.


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.


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.


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));

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);

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);

4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);

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'),?,?,?,?,?)"); 

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.


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.


0

Ich bevorzuge immer noch die Methode in einer Zeile

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

-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()));
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.