web-dev-qa-db-ja.com

OraclejdbcのPreparedStatementとsetTimestamp

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に変更できません。

ご協力いただきありがとうございます

19
Roman

UTCタイムゾーンのPreparedStatementにタイムスタンプ値を設定するには、次を使用する必要があります

stmt.setTimestamp(1, t, Calendar.getInstance(TimeZone.getTimeZone("UTC")))

タイムスタンプ値は常にUTCですが、jdbcドライバーが自動的にサーバーに正しく送信できるとは限りません。 3番目のCalendarパラメーターは、ドライバーがサーバーの値を正しく準備するのに役立ちます。

24
Roman