(java筆記)ClassCastException: java.util.Date cannot be cast to java.sql.Date
阿新 • • 發佈:2018-12-31
目的
根據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型別