我遇到一些遗留代码的奇怪问题。当我在 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 的最佳方式,但这是我无法更改的遗留代码,我正在尝试找出它在一个环境中无法正常工作的原因。
数据库环境是Oracle 11g,使用ojdbc6.jar
编辑:更奇怪的是,这不会发生在所有时间戳上,只会发生在某些时间戳上。我真的不明白这是怎么回事...
最佳答案
好的,我找到了解决方案。这个问题仍然暗示着我,但这至少解决了它。
更改:
ps.setTimestamp(1, ts);
致:
ps.setTimestamp(1, ts, Calendar.getInstance(TimeZone.getDefault()));
关于java - Oracle 上 Linux 与 Windows 数据库查询中的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17171688/