(java笔记)ClassCastException: java.util.Date cannot be cast to java.sql.Date

目的

根据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);

为什么会这样呢:

  1. oracle默认的系统时间就是sysdate函数,储存的数据形如25-3-200510:55:33
  2. java 中取时间的对象是java.util.Date。
  3. oracle中对应的时间对象是java.util.Date,java.sql.Time,java.sql.Timestamp、它们都是是java.util.Date的子类。
  4. oracle中与date操作关系最大的就是两个转换函数:to_date(),to_char()。to_date()一般用于写入日期到数据库时用到的函数。to_char()一般用于从数据库读入日期时用到的函数。

所以可以看到我们问题就解决了,先将String 格式转为date (java.util)
在获取time也就是相对1900的时间差 秒,再将秒,转为sql.date类型

参考:Oracle | Java日期处理

你可能感兴趣的:(java)