0

いくつかのレガシー コードで奇妙な問題が発生しています。これは、Windowsで実行すると機能しますが、Linuxから実行すると機能しません。

...
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-03-10 03:35:16.0' を出力します。ただし、Windows では "FOUND? true" が表示され、Linux では "FOUND? false" が表示されます。

ここで何が起こっているのでしょうか?

注: これがここで JDBC を使用するのに最適な方法ではないことはわかっていますが、これは変更を加えることができないレガシー コードであり、ある環境で正しく動作しない理由を突き止めようとしています。

DB環境はojdbc6.jarを使ったOracle 11g

編集:さらに奇妙なのは、これがすべてのタイムスタンプで発生するのではなく、特定のタイムスタンプで発生することです。ここで何が起こっているのか本当にわかりません...

4

1 に答える 1

1

わかりました、解決策を見つけることができました。問題はまだ私をほのめかしていますが、これで少なくとも解決します。

変化する:

ps.setTimestamp(1, ts);

に:

ps.setTimestamp(1, ts, Calendar.getInstance(TimeZone.getDefault()));
于 2013-06-18T15:54:05.143 に答える