2010-05-18 105 views
17

我在使用PreparedStatement的與時間戳條款: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的類型。 – 2010-05-18 14:38:43

回答

22

設置在UTC時區一個PreparedStatement時間戳值應該使用

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

時間戳值始終是UTC,但並不總是JDBC驅動程序可以自動發送它正確地到服務器。第三個Calendar參數幫助驅動程序正確準備服務器的值。

+3

實際上,它是:setTimestamp(int parameterIndex,Timestamp x,Calendar cal) – rhu 2011-07-07 08:52:41

+1

在我的環境中,設置具有不同時區的日曆對象會影響寫入的SQL數據。 – Robert 2014-10-27 14:13:40

相關問題