Po stronie Java data jest zwykle reprezentowana przez (źle zaprojektowany, ale na bok) java.util.Date
. Zasadniczo jest wspierany przez Czas epoki
w stylu long
, znany również jako sygnatura czasowa. Zawiera informacje o częściach daty i godziny. W Javie precyzja jest w milisekundach.
Po stronie SQL istnieje kilka standardowych typów daty i czasu, DATE
, CZAS
i TIMESTAMP
(w niektórych bazach danych nazywanych także DATETIME
), które są reprezentowane w JDBC jako java.sql.Data
, java.sql.Time
i java.sql.Timestamp
, wszystkie podklasy z java.util.Date
. Dokładność zależy od bazy danych, często w milisekundach, jak w Javie, 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ń). Czas
zawiera tylko informacje o części czasowej (godziny, minuty, sekundy) i znacznik czasu
zawiera informacje o obu częściach, np. java.util.Date
tak.
Normalna praktyka przechowywania znacznika czasu w bazie danych (stąd java.util.Date
po stronie Java i java.sql.Timestamp
po stronie JDBC) jest użycie Przygotowane oświadczenie#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ą uzyskiwania znacznika czasu z bazy danych jest użycie ResultSet#getTimestamp()
.
Timestamp timestamp = resultSet.getTimestamp("ts");
java.util.Date date = timestamp; // You can just upcast.