PreparedStatement и setTimestamp в oracle jdbc

Я использую PreparedStatement с Timestamp в where 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.

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

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

Спасибо за помощь

Ответ 1

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

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

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