Jak przechowywać datę Java w MySQL datetime z JPA

104

Czy ktoś może mi powiedzieć, jak mogę przechowywać datę Java w datetime MySQL ...?

Kiedy próbuję to zrobić ... zapisywana jest tylko data, a czas pozostaje 00:00:00 w sklepach z datą MySQL, takich jak ten ...

2009-09-22 00:00:00

Chcę nie tylko randki, ale także czasu ... lubię

2009-09-22 08:08:11

Używam JPA (Hibernate) z wiosennymi klasami mydomain używa java.util.Date, ale utworzyłem tabele za pomocą odręcznych zapytań ...

to jest moja deklaracja tworzenia

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
źródło
może fragmenty twojego kodu?
Bozho
1
W dzisiejszych czasach nie powinno się już java.util.Datew ogóle używać (w 2010 prawdopodobnie nie było lepszego wyboru). Lepiej jest używać nowoczesnych klas, takich jak java.time.Instantlub java.time.LocalDateTime, w zależności od dokładnych wymagań dotyczących daty i godziny, którą chcesz przechowywać.
Ole VV
Niektóre z tych starych odpowiedzi pojawiają się dość wysoko w rankingach Google. W Javie 8+ możemy po prostu użyć LocalDateTime, aby zapisać datetime zamiast uciekać się do używania @Temporal do zapisywania w formacie datetime
HopeKing
readyStatement.setTimestamp (1, new Timestamp (System.currentTimeMillis ()));
Rajat

Odpowiedzi:

165

zobacz w linku:

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

Poniższy kod właśnie rozwiązał problem:

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

Ten „ currentTime ” został wstawiony do kolumny o typie DateTime i zakończyła się powodzeniem.

Haim Evgi
źródło
4
ale currentTime jest obiektem typu String, aw db bierzemy datetime jako typ danych, myślę, że nie zostanie wstawiony. prawda?
reddy
yyyy-MM-dd HH:mm:ssto bardzo ważne. Zwróć uwagę na wielkie litery.
biniam
91

Opisz swoje pole (lub getter) w @Temporal(TemporalType.TIMESTAMP)następujący sposób:

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

To powinno załatwić sprawę.

Pascal Thivent
źródło
2
To jest rzeczywiście odpowiedź!
Perneel
2
na to, to jest właściwa odpowiedź.
Ryan
3
pamiętaj, że jeśli wybierzesz to rozwiązanie, Twoja data pojawi się jako znacznik czasu podczas pobierania z bazy danych. Nie będzie miał ładnego formatowania „rrrr-MM-dd ....”)
jon
37

Czy może używasz java.sql.Date? Chociaż ma on dokładność milisekundową jako klasa Java (jest to podklasa java.util.Datezłej decyzji projektowej), zostanie zinterpretowana przez sterownik JDBC jako data bez składnika czasu. Zamiast tego musisz użyć java.sql.Timestamp.

Michael Borgwardt
źródło
1
Nie używałbym java.sql.Dateani java.sql.Timestampw klasach domeny, ale myślę, że zostało to napisane przed edycją OP.
Pascal Thivent
Ja bym. Obiekty java.util.Date nie są porównywane z obiektami java.sql.Timestamp z całkowicie przewidywalnymi wynikami.
Doug Moscrop,
8

Prawdopodobnie dlatego, że Twoja data java ma inny format niż mysql format( YYYY-MM-DD HH:MM:SS)

Zrób to

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
 Date date = new Date();
 System.out.println(dateFormat.format(date));
Marcx
źródło
Podałeś poprawny format w pliku referencyjnym, a następnie użyłeś niewłaściwego formatu w kodzie.
Merric Huffstutler
6

otrzymasz 2011-07-18 + format czasu

long timeNow = Calendar.getInstance().getTimeInMillis();
java.sql.Timestamp ts = new java.sql.Timestamp(timeNow);
...
preparedStatement.setTimestamp(TIME_COL_INDEX, ts);
Anuj
źródło
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
źródło
4
java.util.Date date = new Date();
Object param = new java.sql.Timestamp(date.getTime());    
preparedStatement.setObject(param);
michdraft
źródło
1

Użyj poniższego kodu, aby wstawić datę do MySQL. Zamiast zmieniać format naszej daty, aby spełnić wymagania MySql, możemy pomóc bazie danych rozpoznać naszą datę, ustawiającSTR_TO_DATE(?, '%l:%i %p') parametrów.

Na przykład 2014-03-12 można przedstawić jako 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
źródło
1

Jest to bardzo proste, chociaż warunki w tej odpowiedzi są w mysql, typ danych kolumny to datetime i chcesz wysłać dane z kodu java do mysql:

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

ważne jest, aby po prostu wybrać datę, a jej format jest już zgodny z formatem mysql i wysłać, bez dalszych modyfikacji.

Yash Agrawal
źródło
0

Właściwie nie możesz używać SimpleDateFormat, możesz użyć czegoś takiego;

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

W ten sposób możesz bezpośrednio pobrać datę w określonym formacie.

Sahin Yanlık
źródło
0

Nadal wolę metodę w jednej linii

new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime())
Mohannd
źródło
-2

mi to pasuje !!

w tabeli mysql

DATETIME

w jednostce:

private Date startDate;

w trakcie:

objectEntity.setStartDate(new Date());

w przygotowanym oświadczeniu:

pstm.setDate(9, new java.sql.Date(objEntity.getStartDate().getTime()));
Miguel Alonso Mosquera Aguilar
źródło