事由:一个数据导入功能,其通过视图表里一条数据的时间字段作为判断是否已导入的标识。

      每次记录最后导入的一条数据的时间字段,下一次判断则导入上一次记录下的时间字段值以后的数据。

失败经验:网上看到有网友提供了“ff”可以精确到毫秒,代码如下:

  • 存最后一条数据的时间字段值,主要代码如下:

  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");//定义格式,显示毫秒
  String date = df.format(lastdate);

  • sql查询语句代码如下:

  String lastdate = props.getProperty("lastdate"); //获取最后一次记录的时间值
  String sql = "select * from ( select * from view_news " ;
  if(null!=lastdate&&lastdate.length()>0){  
   sql +=" where create_date>to_date('"+lastdate+"','yyyy-MM-dd HH24:mi:ss ff') ";
  }
  sql +="  order by Create_date ) where rownum <= 1000  ";

  Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
  rs = stmt.executeQuery(getDocsSql());

 可以看到配置文件里存入的值为:lastdate=2010-11-20 03/:57/:58 000

 但是在执行sql语句时to_date报:日期格式无法识别

解决思路:

      Statement 改为采用PreparedStatement,通过设置参数值setTimestamp()的方式来进行转换。

      String sql = "select * from ( select * from view_news " ;
      if(null!=lastdate&&lastdate.length()>0){ 
        sql +=" where create_date>?";
      }
     sql +="  order by Create_date ) where rownum <= 1000  ";

      PreparedStatement stmt = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
     
      if(lastdate1!=null && lastdate1.length()>0 )
       stmt.setTimestamp(1, Timestamp.valueOf(lastdate1));
      rs = stmt.executeQuery(); 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐