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;

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.


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ę.


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.


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

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

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

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

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.


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.


0

Nadal wolę metodę w jednej linii

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

-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()));
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.