2010-07-24 13 views

Odpowiedz

90

Po stronie Java data jest zwykle reprezentowana przez (źle zaprojektowane, ale na marginesie) java.util.Date. Zasadniczo jest on wspierany przez Epoch time w smaku long, znany również jako znacznik czasu. Zawiera informacje na temat części daty i godziny. W Javie dokładność wynosi milisekundy.

W SQL strony, istnieje kilka standardowych typów daty i czasu, DATE, TIME i TIMESTAMP (w niektórych DB zwany także DATETIME), które są przedstawione w JDBC jako java.sql.Date, java.sql.Time i java.sql.Timestamp, wszystkie podklasy z java.util.Date. Precyzja zależy od DB, często w milisekundach, takich jak Java, ale może być również w sekundach.

W przeciwieństwie do java.util.Date, java.sql.Date zawiera tylko informacje o części daty (rok, miesiąc, dzień). Numer Time zawiera tylko informacje o części czasowej (godziny, minuty, sekundy), a Timestamp zawiera informacje o obu częściach, takie jak: java.util.Date.

normalna praktyka do przechowywania znacznik czasu w DB (czyli java.util.Date Java i w bok w bok java.sql.Timestamp JDBC) jest użycie PreparedStatement#setTimestamp().

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

Normalną praktyką jest uzyskanie z bazy danych znacznika czasu jest użycie ResultSet#getTimestamp().

+6

myślisz, że używanie java.sql.Timestamp w modelu (warstwa Java) jest złe? – cherouvim

+7

@cherouvim: Tak. Model nie powinien być świadomy żadnych szczegółów JDBC. Używaj go tylko do ustawiania znacznika czasu. 'preparedStatement.setTimestamp (new Timestamp (date.getTime()));'. Uzyskanie go jest łatwe, ponieważ jest już podklasą 'java.util.Date'. – BalusC

+1

To zadziała dobrze, jeśli wszystkie twoje komputery i użytkownicy będą w tej samej strefie czasowej. W przeciwnym razie należy uważać, że obsługa sterownika JDBC przez sterownik JDBC dla stref czasowych jest niesamowicie złożona i nieporęczna. Na przykład zobacz http: // stackoverflow.com/questions/40670532/what-are-jdbc-mysql-driver-settings-for-sane-handling-of-datetime-and-timestamp/40681941 # 40681941 –

6

Urządzenie MySQL documentation ma informacje na temat mapowania typów MySQL na typy Java. Ogólnie dla datetime i znaczników czasowych MySQL należy użyć java.sql.Timestamp. Kilka zasoby obejmują:

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:

Jak wykazały inne sugestia użycia strun może prowadzić do problemów.

+0

dlaczego lepiej konwertować daty na ciągi? – cherouvim

+6

Nie masuj go i wracaj jako struny. To przepis na problemy z przenoszeniem i konserwacją. – BalusC

+0

Uzgodnione. Odpowiednio zmodyfikowałem swoją odpowiedź. – Garett

Powiązane problemy