2010-05-18 2 views
17

Я использую PreparedStatement с Timestamp в котором пункт:PreparedStatement и setTimestamp в Oracle JDBC

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.

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

+0

Измените свой вопрос и добавьте типы t_begin и t_end. –

ответ

22

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

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

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

+3

На самом деле это: setTimestamp (int parameterIndex, Timestamp x, Calendar cal) – rhu

+1

В моей среде настройка объекта календаря с другим часовым поясом влияет на данные SQL, которые написаны. – Robert

Смежные вопросы