後臺存入記錄進入數據庫,數據類型報錯往往是日期類型出錯。今天說說面對日期類型在不同數據表中的不同設置,我們該如何針對數據庫參數類型的傳參呢?
問題描述:
在系統的多人合作中,有的同事把表日期類型設置爲 varchar2類型,有的同事把表日期類型設置爲Date類型,存入日期咋傳?
解決方法:
首先我們基本都是從前端的插件中選擇時間傳入後臺取參數時,該參數類型爲一個字符串類型。
1.當數據表的日期設置爲varchar2類型,在java中我們通過SimpleDateFormat 進行規範化參數後直接參數傳入進行比對就好了,如果數據表中爲date類型,傳入字符串類型就會報
ORA-01861:文字和格式字符串不匹配
String finishDate = request.getParameter("finishDate")==null?"":request.getParameter("finishDate");
SimpleDateFormat matter = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
if ("".equals(finishDate) || finishDate== null) {
finishDate= matter.format(calendar.getTime());
}
通常是一個起始時間和結束時間查詢時間段期間的所有記錄
if(recordDate!=null && !"".equals(recordDate.trim())){
sql.append(" and productiondate >= '").append(recordDate.trim()).append("' ");
}
if(finishDate!=null && !"".equals(finishDate.trim())){
sql.append(" and productiondate <= '").append(finishDate.trim()).append("' ");
}
2. 當數據表的日期設置爲date類型時,在mysql中我將前臺取得的字符串進行轉換爲日期類型傳入即可
String recordDate= "2016-10-24 21:59:06";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf.parse(recordDate));
而在oracle中這種做法會報錯誤,
ORA-01858 :在要求輸入數字處找到非數字字符
解決辦法是用oracle自帶的 to_date 函數,這樣就沒問題了啦。
if(recordDate!=null && !"".equals(recordDate.trim())){
sql.append(" and creation_date >= to_date( '").append(recordDate.trim()).append("','YYYY-MM-DD HH24:MI:SS') ");
}
if(finishDate!=null && !"".equals(finishDate.trim())){
sql.append(" and creation_date <= to_date( '").append(finishDate.trim()).append("','YYYY-MM-DD HH24:MI:SS') ");
}
一般的人不都是把數據庫日期類型設置爲varchar2的嗎,變量名不是按照可識別的意思用駝峯原則命名嗎?今天在做一個外部表查詢時沒看清楚浪費了兩小時苦苦掙扎。
oracle的序列取出的類型是bigdecimal的
寫插入日誌表報這個錯,是因爲數據庫是varchar2傳入bigdecimal,數據庫是date類型傳入varchar2類型導致