修复无效数据会话 Java jdbc 到 DB2
Fix Invalid data conversation Java jdbc to DB2
每当我 运行 我准备好的陈述如下 SQL:
SELECT SUM(TEST_UNITS) FROM TESTDB.TEST
WHERE ((S_TS >= ? AND S_TS <= ?) or (E_TS >= ? AND E_TS <= ?) OR (S_TS < ? AND E_TS > ?))
我得到非常随机的数据以及以下错误消息:
com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][10177][11615][3.61.75] Invalid data conversion: Requested conversion would result in a loss of precision of 2579055604. ERRORCODE=-4461, SQLSTATE=42815
- 在 DB2 数据库上
TEST_UNITS
是一个 BIGINT
- 和
S_TS
和E_TS
都来自数据类型TIMESTAMP
然而,由于我触发了一个准备好的语句,我已经尝试过:
Calendar.getTime()
- 使用简单的日期格式
sdf.format(Calendar.getTime())
new java.sql.Timestamp(Calendar..getTimeInMillis())
如果没有转换错误,似乎无法正常工作。可能甚至不是导致问题的时间。有人知道问题出在哪里吗?
编辑:
请求的代码片段:
public ChartDataSetMSU msuWOMachine(Connection con, Date date){
PreparedStatement prepStmt = null;
ResultSet rs = null;
ChartDataSetMSU chartDataMsu = new ChartDataSetMSU();
int[] msuSaver = chartDataMsu.getHouresMsu();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSSSSS");
Calendar vonCal = Calendar.getInstance();
Calendar bisCal = Calendar.getInstance();
vonCal.setTime(date);
vonCal.set(Calendar.HOUR_OF_DAY, 0);
vonCal.set(Calendar.MINUTE, 0);
vonCal.set(Calendar.SECOND, 0);
vonCal.set(Calendar.MILLISECOND, 0);
bisCal.setTime(date);
bisCal.set(Calendar.HOUR_OF_DAY, 1);
bisCal.set(Calendar.MINUTE, 0);
bisCal.set(Calendar.SECOND, 0);
bisCal.set(Calendar.MILLISECOND, 0);
for(int i = 0; i < 24; i++){
try {
prepStmt = con.prepareStatement("SELECT SUM(TEST_UNITS) FROM TESTDB.TEST WHERE ((S_TS >= ? AND S_TS <= ?) or (E_TS >= ? AND E_TS <= ?) OR (S_TS < ? AND E_TS > ?))");
prepStmt.setString(1, sdf.format(vonCal.getTime()));
prepStmt.setString(2, sdf.format(bisCal.getTime()));
prepStmt.setString(3, sdf.format(vonCal.getTime()));
prepStmt.setString(4, sdf.format(bisCal.getTime()));
prepStmt.setString(5, sdf.format(vonCal.getTime()));
prepStmt.setString(6, sdf.format(bisCal.getTime()));
rs = prepStmt.executeQuery();
if(rs.next())
{
msuSaver[i] = rs.getInt(1);
systemLog.debug("Ammount this hour: " + i +" --> " + msuSaver[i]);
}
} catch (SQLException e) {
e.printStackTrace();
}
vonCal.add(Calendar.HOUR_OF_DAY, 1);
bisCal.add(Calendar.HOUR_OF_DAY, 1);
}
chartDataMsu.setHouresMsu(msuSaver);
return chartDataMsu;
}
DB2 中的 TIMESTAMP 正在显示这样的数据
2015-07-31-13.37.01.000000
因为TEST_UNITS在DB2中是一个BigInt,你需要使用JDBC API getLong()来获取它。 getInt() 获取一个整数,因此这将导致可能的数据转换问题和 precision/data.
的丢失
行
msuSaver[i] = rs.getInt(1);
需要
msuSaver[i] = rs.getLong(1);
我没有查看整个代码是否需要更改 msuSaver 和相关格式。
每当我 运行 我准备好的陈述如下 SQL:
SELECT SUM(TEST_UNITS) FROM TESTDB.TEST
WHERE ((S_TS >= ? AND S_TS <= ?) or (E_TS >= ? AND E_TS <= ?) OR (S_TS < ? AND E_TS > ?))
我得到非常随机的数据以及以下错误消息:
com.ibm.db2.jcc.am.SqlSyntaxErrorException: [jcc][10177][11615][3.61.75] Invalid data conversion: Requested conversion would result in a loss of precision of 2579055604. ERRORCODE=-4461, SQLSTATE=42815
- 在 DB2 数据库上
TEST_UNITS
是一个BIGINT
- 和
S_TS
和E_TS
都来自数据类型TIMESTAMP
然而,由于我触发了一个准备好的语句,我已经尝试过:
Calendar.getTime()
- 使用简单的日期格式
sdf.format(Calendar.getTime())
new java.sql.Timestamp(Calendar..getTimeInMillis())
如果没有转换错误,似乎无法正常工作。可能甚至不是导致问题的时间。有人知道问题出在哪里吗?
编辑:
请求的代码片段:
public ChartDataSetMSU msuWOMachine(Connection con, Date date){
PreparedStatement prepStmt = null;
ResultSet rs = null;
ChartDataSetMSU chartDataMsu = new ChartDataSetMSU();
int[] msuSaver = chartDataMsu.getHouresMsu();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH.mm.ss.SSSSSS");
Calendar vonCal = Calendar.getInstance();
Calendar bisCal = Calendar.getInstance();
vonCal.setTime(date);
vonCal.set(Calendar.HOUR_OF_DAY, 0);
vonCal.set(Calendar.MINUTE, 0);
vonCal.set(Calendar.SECOND, 0);
vonCal.set(Calendar.MILLISECOND, 0);
bisCal.setTime(date);
bisCal.set(Calendar.HOUR_OF_DAY, 1);
bisCal.set(Calendar.MINUTE, 0);
bisCal.set(Calendar.SECOND, 0);
bisCal.set(Calendar.MILLISECOND, 0);
for(int i = 0; i < 24; i++){
try {
prepStmt = con.prepareStatement("SELECT SUM(TEST_UNITS) FROM TESTDB.TEST WHERE ((S_TS >= ? AND S_TS <= ?) or (E_TS >= ? AND E_TS <= ?) OR (S_TS < ? AND E_TS > ?))");
prepStmt.setString(1, sdf.format(vonCal.getTime()));
prepStmt.setString(2, sdf.format(bisCal.getTime()));
prepStmt.setString(3, sdf.format(vonCal.getTime()));
prepStmt.setString(4, sdf.format(bisCal.getTime()));
prepStmt.setString(5, sdf.format(vonCal.getTime()));
prepStmt.setString(6, sdf.format(bisCal.getTime()));
rs = prepStmt.executeQuery();
if(rs.next())
{
msuSaver[i] = rs.getInt(1);
systemLog.debug("Ammount this hour: " + i +" --> " + msuSaver[i]);
}
} catch (SQLException e) {
e.printStackTrace();
}
vonCal.add(Calendar.HOUR_OF_DAY, 1);
bisCal.add(Calendar.HOUR_OF_DAY, 1);
}
chartDataMsu.setHouresMsu(msuSaver);
return chartDataMsu;
}
DB2 中的 TIMESTAMP 正在显示这样的数据
2015-07-31-13.37.01.000000
因为TEST_UNITS在DB2中是一个BigInt,你需要使用JDBC API getLong()来获取它。 getInt() 获取一个整数,因此这将导致可能的数据转换问题和 precision/data.
的丢失行
msuSaver[i] = rs.getInt(1);
需要
msuSaver[i] = rs.getLong(1);
我没有查看整个代码是否需要更改 msuSaver 和相关格式。