java.sql.PreparedStatementで時刻データを代入する際の注意

java.sql.PreparedStatementで、SQL文に時刻データを代入する際の注意点。

setDate(java.sql.Date date)のメソッドを使用した場合、引数のjava.sql.Dateのインスタンスがミリ秒まで指定されていても、時間以下の値は全て切り捨てられてしまう。(ドライバが引数の値をSQL DATE値に変換するため。)

参考 : PreparedStatement#setDate(https://docs.oracle.com/javase/jp/8/docs/api/java/sql/PreparedStatement.html#setDate-int-java.sql.Date-)

時間以下の値も代入したい場合は、setTimestamp(java.sql.Timestamp timestamp)のメソッドを利用すれば良い。

参考 : PreparedStatement#setTimestamp(https://docs.oracle.com/javase/jp/8/docs/api/java/sql/PreparedStatement.html#setTimestamp-int-java.sql.Timestamp-)

ちなみにjava.util.Dateから上記2つの方への変換はいずれも以下のように簡単にできる。

java.util.Date date = new java.util.Date();

// java.util.Dateをjava.sql.Dateに変換
new java.sql.Date(date.getTime());

// java.util.Dateをjava.sql.Timestampに変換
new java.sql.Timestamp(date.getTime());