数据存入问题 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配、数字类型填入了非数字类型

后台存入记录进入数据库,数据类型报错往往是日期类型出错。今天说说面对日期类型在不同数据表中的不同设置,我们该如何针对数据库参数类型的传参呢?

问题描述:

在系统的多人合作中,有的同事把表日期类型设置为 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的吗,变量名不是按照可识别的意思用驼峰原则命名吗?今天在做一个外部表查询时没看清楚浪费了两小时苦苦挣扎。


版权声明:本文为xc121566原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。