2010-07-24 6 views

Antwort

90

In Java-Seite wird das Datum in der Regel durch die (schlecht entworfen, aber das beiseite) java.util.Date dargestellt. Es ist im Grunde von der Epoch time im Geschmack eines long, auch bekannt als ein Zeitstempel. Es enthält Informationen zu Datum und Uhrzeit. In Java ist die Genauigkeit in Millisekunden.

In SQL-Seite gibt es mehrere Standard Datums- und Uhrzeittypen, DATE, TIME und TIMESTAMP (bei einigen der DB auch DATETIME genannt), die in JDBC als java.sql.Date, java.sql.Time und java.sql.Timestamp alle Subklassen von java.util.Date vertreten sind. Die Genauigkeit ist DB-abhängig, oft in Millisekunden wie Java, aber auch in Sekunden.

Im Gegensatz zu java.util.Date enthält die java.sql.Date nur Informationen zum Datumsteil (Jahr, Monat, Tag). Die Time enthält nur Informationen über den Zeitteil (Stunden, Minuten, Sekunden) und die Timestamp enthält Informationen über beide Teile, wie zB java.util.Date.

Die normale Praxis, einen Zeitstempel in der DB zu speichern (so java.util.Date in Java Seite und java.sql.Timestamp in JDBC-Seite) ist PreparedStatement#setTimestamp() zu verwenden.

java.util.Date date = getItSomehow(); 
Timestamp timestamp = new Timestamp(date.getTime()); 
preparedStatement = connection.prepareStatement("SELECT * FROM tbl WHERE ts > ?"); 
preparedStatement.setTimestamp(1, timestamp); 

Die normale Praxis einen Zeitstempel von der DB zu erhalten, ist ResultSet#getTimestamp() zu verwenden.

Timestamp timestamp = resultSet.getTimestamp("ts"); 
java.util.Date date = timestamp; // You can just upcast. 
+6

meinst du, dass die Verwendung von java.sql.Timestamp im Modell (Java-Ebene) schlecht ist? – cherouvim

+7

@ cherouvim: Ja. Das Modell sollte keine JDBC-spezifischen Informationen kennen. Verwenden Sie es nur, um den Zeitstempel festzulegen. 'preparedStatement.setTimestamp (neuer Timestamp (date.getTime()));'. Es zu bekommen ist einfach, da es bereits eine Unterklasse von 'java.util.Date' ist. – BalusC

+1

Dies funktioniert, wenn sich alle Ihre Computer und Benutzer in derselben Zeitzone befinden. Andernfalls, hüten Sie sich vor der Handhabung des MySQL JDBC-Treibers von Zeitzonen-Konvertierungen ist unglaublich komplex und fehlerhaft. Zum Beispiel siehe http: // stackoverflow.com/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-von-datumzeit-und-zeitstempel/40681941 # 40681941 –

6

Das MySQL documentation enthält Informationen zum Zuordnen von MySQL-Typen zu Java-Typen. Im Allgemeinen sollten Sie für Datums- und Zeitstempel von MySQL java.sql.Timestamp verwenden. Einige Ressourcen umfassen:

http://dev.mysql.com/doc/refman/5.1/en/datetime.html

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

How to store Java Date to Mysql datetime...?

http://www.velocityreviews.com/forums/t599436-the-best-practice-to-deal-with-datetime-in-mysql-using-jdbc.html

EDIT:

Wie andere schon angedeutet haben, der Vorschlag Ketten mit zu Problemen führen kann.

+0

Warum wäre es besser, die Daten in Strings zu konvertieren? – cherouvim

+6

Massieren Sie es nicht als Saite vor und zurück. Es ist ein Rezept für Portabilität und Wartungsfreundlichkeit. – BalusC

+0

Einverstanden. Ich habe meine Antwort entsprechend modifiziert. – Garett