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

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

失败经验:网上看到有网友提供了“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

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐