后台存入记录进入数据库,数据类型报错往往是日期类型出错。今天说说面对日期类型在不同数据表中的不同设置,我们该如何针对数据库参数类型的传参呢?
问题描述:
在系统的多人合作中,有的同事把表日期类型设置为 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类型导致