PreparedStatement и setTimestamp в оракуле JDBC - PullRequest
19 голосов
/ 18 мая 2010

Я использую PreparedStatement с меткой времени в предложении where:

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"));

Результат, который я получаю, отличается, когда у меня разные часовые пояса на клиентском компьютере. Это ошибка в Oracle JDBC? или правильное поведение?

Версия базы данных Oracle - 10.2, и я пробовал использовать тонкий драйвер oracle jdbc версий 10.2 и 11.1.

Параметр Timestamp, и я ожидал, что в пути преобразование времени не будет. Тип столбца базы данных - DATE, но я также проверил его с типом столбца TIMESTAMP с теми же результатами.

Есть ли способ добиться правильного результата? Я не могу изменить часовой пояс по умолчанию во всем приложении на UTC.

Спасибо за вашу помощь

1 Ответ

24 голосов
/ 07 июня 2010

Чтобы установить значение метки времени в PreparedStatement в часовом поясе UTC, следует использовать

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

Значение метки времени всегда UTC, но не всегда драйвер jdbc может автоматически правильно отправить его на сервер. Третий, параметр Calendar, помогает драйверу правильно подготовить значение для сервера.

...