将字符串日期转换为长日期并更新derby数据库中的行

时间:2013-09-19 11:32:08

标签: java jdbc derby

在我的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数据库工作。

1 个答案:

答案 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或类似名称。