在我的java应用程序中,我试图更新一些具有长日期值的行。我在下面粘贴了我的代码。表名为"CASHSELL"
,其中列为"DATE VARCHAR(20)
和"DATES BIGINT"
。
String query = "SELECT DATE, DATES FROM CASHSELL";
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
try{
conn = new connection().db();
stmtt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
rs = stmtt.executeQuery(query);
while (rs.next()){
String dat = rs.getString("DATE");
Date d = (Date) sdf.parse(dat);
long longDate = d.getTime();
rs.updateLong("DATES", longDate);
rs.updateRow();
conn.commit();
}
}
catch(SQLException | ParseException ex){JOptionPane.showMessageDialog(null, ex);
}
finally{try{rs.close(); conn.close(); stmtt.close();}catch(SQLException ex){} }
此方法无论如何都无法正常工作。我在这里犯的错是什么?没有错误信息吗?我错过了什么吗?或者它不是用JDBC更新的正确方法?还有其他方法,以便我可以通过将字符串日期转换为长日期来更新1,00,000行吗?
我在Derby数据库工作。
答案 0 :(得分:1)
根本不需要循环或SELECT
。
update CASHSELL
set dates = {fn TIMESTAMPDIFF(SQL_TSI_SECOND, timestamp ('1970-01-01 00:00:00'), "DATE") } * 1000;
TIMESTAMPDIFF
将返回1970-01-01与DATE
列值之间的秒数。由于long
的{{1}}值是此后 milli 秒的数量,因此您需要将结果乘以1000。
因此,上述语句会将java.util.Date
列更新为dates
列的相应长值。
但我不明白为什么你想这样做。存储派生值通常不是一个好主意。从表中检索数据时,您始终可以“即时”计算该值。
顺便说一下:DATE
是一个可怕的名字。首先是因为它是一个保留字,可能导致很多混乱。其次,因为它没有记录数据模型。这是“截止日期”,“有效日期”,“有效日期”,“生日”.......
DATE
同样令人困惑。您应该将其命名为DATES
或类似名称。