java.util.Date vs java.sql.Date: when to use which and why?
java.util.Date vs java.sql.Date : when to use which and why?
Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
Congratulations, you’ve hit my favorite pet peeve with JDBC: Date class handling.
Basically databases usually support at least three forms of datetime fields which are date, time and timestamp. Each of these have a corresponding class in JDBC and each of them extend
java.util.Date. Quick semantics of each of these three are the following:java.sql.Datecorresponds to SQL DATE which means it stores years, months and days while hour, minute, second and millisecond are ignored. Additionallysql.Dateisn’t tied to timezones.java.sql.Timecorresponds to SQL TIME and as should be obvious, only contains information about hour, minutes, seconds and milliseconds.java.sql.Timestampcorresponds to SQL TIMESTAMP which is exact date to the nanosecond (note thatutil.Dateonly supports milliseconds!) with customizable precision.One of the most common bugs when using JDBC drivers in relation to these three types is that the types are handled incorrectly. This means that
sql.Dateis timezone specific,sql.Timecontains current year, month and day et cetera et cetera.Finally: Which one to use?
Depends on the SQL type of the field, really.
PreparedStatementhas setters for all three values,#setDate()being the one forsql.Date,#setTime()forsql.Timeand#setTimestamp()forsql.Timestamp.Do note that if you use
ps.setObject(fieldIndex, utilDateObject);you can actually give a normalutil.Dateto most JDBC drivers which will happily devour it as if it was of the correct type but when you request the data afterwards, you may notice that you’re actually missing stuff.I’m really saying that none of the Dates should be used at all.
What I am saying that save the milliseconds/nanoseconds as plain longs and convert them to whatever objects you are using (obligatory joda-time plug). One hacky way which can be done is to store the date component as one long and time component as another, for example right now would be 20100221 and 154536123. These magic numbers can be used in SQL queries and will be portable from database to another and will let you avoid this part of JDBC/Java Date API:s entirely.