Where句でTimestampとともにPreparedStatementを使用しています。
PreparedStatement s=c.prepareStatement("select value,utctimestamp from t where utctimestamp>=? and utctimestamp<?");
s.setTimestamp(1, new Timestamp(1273017600000L)); //2010-05-05 00:00 GMT
s.setTimestamp(2, new Timestamp(1273104000000L)); //2010-05-06 00:00 GMT
ResultSet rs = s.executeQuery();
if(rs.next()) System.out.println(rs.getInt("value"));
クライアントコンピューターに異なるタイムゾーンがある場合、得られる結果は異なります。これはOraclejdbcのバグですか?または正しい動作?
Oracleデータベースのバージョンは10.2で、Oraclejdbcシンドライバーバージョン10.2および11.1を試してみました。
パラメータはタイムスタンプであり、途中で時間変換が行われないことを期待していました。データベースの列タイプはDATEですが、TIMESTAMP列タイプでも確認したところ同じ結果でした。
正しい結果を達成する方法はありますか?アプリケーション全体のデフォルトのタイムゾーンをUTCに変更できません。
ご協力いただきありがとうございます
UTCタイムゾーンのPreparedStatementにタイムスタンプ値を設定するには、次を使用する必要があります
stmt.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("UTC")))
タイムスタンプ値は常にUTCですが、jdbcドライバーが自動的にサーバーに正しく送信できるとは限りません。 3番目のCalendarパラメーターは、ドライバーがサーバーの値を正しく準備するのに役立ちます。