目的
根据oracle数据库中的一个日期字段,利用Java代码自动更新数据库中的数据。
难点
数据库中的数据字段为
LEASEDAY | DATE类型
在java这边的条件为字符串日期
yyyy-mm-dd | String类型
由于存在这样的类型的差异,就会碰到一些这样的问题:
ClassCastException: java.util.Date cannot be cast to java.sql.Date
解决办法
先上代码
/**
* 单个方法,作用,根据输入的day:yyyy-mm-dd格式的字符日期,将数据库中的该天所有数据更新为0
* 0表示假期
* @param day
* @throws SQLException
* @throws ParseException
*/
public void UpdateDayTypeByLeaseDay(String day) throws SQLException, ParseException{
//UPDATE NYC_TRIP_SUM_BYHOUR SET daytype='0' where leaseday='2016-12-31'
String sql="UPDATE NYC_TRIP_SUM_BYHOUR SET daytype='0' where leaseday=?";
//建立连接
Connection conn=daoUtil.getConnection();
PreparedStatement preStmt=conn.prepareStatement(sql);
// SimpleDateFormat sdfDay=new SimpleDateFormat("yyyy-MM-dd");//小写的mm表示的是分钟
//先将字符日期转为util日期
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
Date dayDateUtil=df.parse(day);
System.out.println("转换成Util日期"+dayDateUtil);
//由于util在sql中不符,再转为sql日期
java.sql.Date dayDateSql = new java.sql.Date(dayDateUtil.getTime());
System.out.println("转换成sql日期"+dayDateSql);
//将日期参数传入
preStmt.setDate(1, dayDateSql);
preStmt.executeQuery();
//关闭连接资源
preStmt.close();
conn.close();
}
关键在于中间的几行:
//先将字符日期转为util日期
SimpleDateFormat df = new SimpleDateFormat("yyyy-mm-dd");
Date dayDateUtil=df.parse(day);
System.out.println("转换成Util日期"+dayDateUtil);
//由于util在sql中不符,再转为sql日期
java.sql.Date dayDateSql = new java.sql.Date(dayDateUtil.getTime());
System.out.println("转换成sql日期"+dayDateSql);
为什么会这样呢:
- oracle默认的系统时间就是sysdate函数,储存的数据形如25-3-200510:55:33
- java 中取时间的对象是java.util.Date。
- oracle中对应的时间对象是java.util.Date,java.sql.Time,java.sql.Timestamp、它们都是是java.util.Date的子类。
- oracle中与date操作关系最大的就是两个转换函数:to_date(),to_char()。to_date()一般用于写入日期到数据库时用到的函数。to_char()一般用于从数据库读入日期时用到的函数。
所以可以看到我们问题就解决了,先将String 格式转为date (java.util)
在获取time也就是相对1900的时间差 秒,再将秒,转为sql.date类型