【问题标题】:Convert a String date to Long Date and update rows in derby database将字符串日期转换为长日期并更新 derby 数据库中的行
【发布时间】:2013-09-19 11:32:07
【问题描述】:

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

【问题讨论】:

  • “不工作”含糊不清——这是怎么回事?您确定格式真的是“dd-MM-yyyy”而不是更常见的“yyyy-MM-dd”吗?
  • 你说要更新一些长日期的行,但我没有看到你的查询中的 where 子句。所以所有行都会受到影响
  • 我必须用不同的值更新所有行。我认为“rs.updateRow()”更新了一行。所以,我试图在循环中执行查询。

标签: java jdbc derby


【解决方案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 列的值之间的秒数。由于java.util.Date 的long 值是此后的毫秒 秒数,因此您需要将结果乘以1000。

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

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

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

DATES 也同样令人困惑。您应该将其命名为 milliseconds 或类似名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 2016-01-28
    • 2018-07-08
    • 2019-03-29
    • 1970-01-01
    相关资源
    最近更新 更多