PreparedStatement и setTimestamp в оракуле jdbc

Я использую 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"));

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

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

Параметр является Меткой времени, и я ожидал, что никакие преобразования времени не будут сделаны на пути. Типом столбца базы данных является ДАТА, но я также проверил его с типом столбца МЕТКИ ВРЕМЕНИ с теми же результатами.

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

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

19
задан Roman 26 May 2010 в 06:27
поделиться

1 ответ

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

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

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

25
ответ дан 30 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: