In primo luogo, si confonde java.util
con java.sql
. Quando si utilizza PreparedStatement#setDate()
e ResultSet#getDate()
, è necessario java.sql.Date
. Analogamente, quando si utilizza PreparedStatement#setTimestamp()
e ResultSet#getTimestamp()
è necessario java.sql.Timestamp
.
In secondo luogo, è importante capire che java.sql.Date
rappresenta solo la data data (anno, mese, giorno) e niente di meno o più. Questo deve essere associato a un tipo di campo SQL DATE
. java.sql.Timestamp
rappresenta la data/ora (anno, mese, giorno, ora, minuto, secondo, millisecondo), esattamente come fa lo java.util.Date
e java.util.Calendar
. Questo deve essere associato a un tipo di campo SQL TIMESTAMP
o DATETIME
.
Per quanto riguarda i fusi orari, è necessario quando il database non memorizza le informazioni sul fuso orario (quindi, tutti i timestamp sono memorizzati in UTC (GMT)). È quindi possibile passare uno Calendar
in cui sono contenute informazioni sul fuso orario corrente, in modo che il driver JDBC possa regolare la data/ora UTC con il timestamp conforme al fuso orario. Se è ad esempio GMT + 1, il driver JDBC aggiungerà un'ora al timestamp prima di tornare.
Buona risposta. Per maggiori informazioni sulle variazioni delle varie classi Date in JDBC puoi fare riferimento al mio post qui: http://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date/2306051# 2306051 – Esko