1

在我的 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 行吗?

我在德比数据库中工作。

4

1 回答 1

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。由于longa 的值是此后的毫秒java.util.Date数,因此您需要将结果乘以 1000。

所以上面的语句会将列更新为该dates列对应的long值DATE

但我不明白你为什么要这样做。存储派生值通常不是一个好主意。从表中检索数据时,您始终可以“即时”计算该值。

顺便说一句:DATE是一个可怕的列名称。首先,因为它是一个保留字,会导致很多混乱。其次,因为它没有记录数据模型。那是“到期日”,“有效日期”,“有效日期”,“生日”......

并且DATES同样令人困惑。你应该命名它milliseconds或类似的东西。

于 2013-09-19T12:07:14.973 回答