2013-06-18 63 views
0

我有一些遺留代碼一個奇怪的問題的窗口。這在我在Windows中運行時起作用,但在我從Linux運行時不起作用。現在時間戳在Linux的數據庫查詢VS甲骨文

... 
ResultSet rs = st.executeQuery("SELECT MODTS from MYTBL WHERE ID = 'X'"); 
rs.next(); 
Timestamp ts = Timestamp.valueOf(rs.getString(1)); 
System.out.println("TS: '" + ts + "'"); 

PreparedStatement ps = conn.prepareStatement("SELECT * from MYTBL WHERE MODTS = ?"); 
ps.setTimestamp(1, ts); 

System.out.println("FOUND? " + ps.executeQuery().next()); 

,兩種環境都連接到相同的數據庫,這兩種環境中打印出的值對TS變量「2013年3月10日03:16.0:35」。然而,在Windows中,我在Linux中得到「FOUND?true」,我得到「FOUND?false」。

有什麼想法可以在這裏發生什麼?

注:我知道這是不是在這裏使用JDBC的最佳方式,但是這是遺留代碼,我不能更改我試圖弄清楚爲什麼它不是在一個環境下正常工作。

的DB環境是使用ojdbc6.jar

編輯的Oracle 11g:什麼是更奇怪的是,這不會發生在所有的時間標記,只是某些人。我真的不知道這裏發生了什麼......

+0

什麼數據類型是'MODTS'列?什麼是從每一個平臺(可從您的Java語言環境中得到)你'NLS_DATE_FORMAT'和'NLS_TIMESTAMP_FORMAT'設置?它看起來像一個隱式轉換的問題,但不知道... –

+0

是否'ts.getTime()'在這兩種情況下,返回相同的'long'價值? 'Timestamp.valueOf(String s)'在系統的時區中創建一個日期。 – DannyMo

+0

我會檢查這些值並回來,同樣,ts.getTime()返回相同的,我也想出瞭如果我做對了,並使用rs.getTimestamp(),而不是字符串轉換它仍然失敗在Linux上的一些其中。 –

回答

1

好的,我能找到解決方案。問題仍然暗示着我,但至少可以解決這個問題。

變化:

ps.setTimestamp(1, ts); 

要:

ps.setTimestamp(1, ts, Calendar.getInstance(TimeZone.getDefault())); 
+0

很好,+1。我會建議你看看v $ sql_bind_capture來找出實際綁定值是什麼。 –