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

本文讨论了在后台存入记录到数据库时遇到的日期类型错误,特别是Oracle数据库中ORA-01861和ORA-01858错误。当日期字段为varchar2或Date类型时,提供了不同的处理方法。对于varchar2类型,使用SimpleDateFormat规范化参数;而对于Date类型,需使用Oracle的to_date函数转换字符串为日期。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

问题描述:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值