事由:一个数据导入功能,其通过视图表里一条数据的时间字段作为判断是否已导入的标识。
每次记录最后导入的一条数据的时间字段,下一次判断则导入上一次记录下的时间字段值以后的数据。
失败经验:网上看到有网友提供了“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();