我面临一个奇怪的问题,即JDBC中的数字和日期字段的值与ResultSet
返回的值不同。
我在数据库中有以下行(仅显示与该问题相关的3列)
J_ID J_DATE J_AMOUNT
1 29-JAN-16 2.339549839
我正在使用标准JDBC从DB中获取此行,如下所示:
while (rs.next()) {
System.out.println(rs.getDouble("J_AMOUNT"));
Timestamp ts = rs.getTimestamp("J_DATE");
Date d = ts != null ? new java.util.Date(ts.getTime()) : null;
System.out.println(d);
}
输出结果为:
2.345773196
Thu Mar 31 00:00:00 IST 2016
我正在试图弄明白为什么 2.339549839 被getDouble
读为 2.345773196 以及为什么 29-JAN-16 通过getDate
方法转换为 Thu Mar 31 00:00:00 IST 2016 。
我正在使用Oracle数据库和odbc5.jar
。我发现了一个相关的问题,但它似乎没有任何答案,评论也没有回答我的问题:
我显然做错了什么但不确定它可能是什么,因为这是一个非常基本的程序。
其他信息:
执行查询以获取我的程序记录的结果集如下:
SELECT B.J_ID, B.J_DATE, ROUND(B.J_AMOUNT, 9) FROM REF.J_MESSAGES B WHERE B.J_ID = 1
转换为时间时J_DATE
字段的值
SELECT B.J_ID, to_char(B.J_DATE, 'YYYY-MM-DD HH24:MI:SS') as J_DATE, ROUND(B.J_AMOUNT, 9) FROM REF.J_MESSAGES B WHERE B.J_ID = 1
J_ID J_DATE J_AMOUNT
1 2016-01-29 00:00:00 2.339549839
使用getString
代替getDouble
和getTimeStamp
会得到以下输出:
2.345773196
2016-03-31 00:00:00.0
我正在使用SQL开发人员在我的oracle数据库上手动执行查询,并且我已经确认我在Java和SQL开发人员中使用了正确的数据库,模式,表和Oracle实例。
这是我桌子上的描述(仅列出与此问题相关的列):
Name Null Type
J_DATE DATE
J_AMOUNT NUMBER(30,14)
JDBC驱动程序版本是:
JDBC driver version is 11.1.0.6.0-Production+
我创建了自己的表,只有2列(J_DATE和J_AMOUNT),这个问题在这个表上也是可以重现的,所以它不太可能是某种同步问题,其中表被另一个系统更新时读取。