NutzCN Logo
精华 对于拼接sql,使用dao.execute(sql)方式查询日期出错(ORA-01861)求解
发布于 3128天前 作者 LIZQing 3796 次浏览 复制 上一个帖子 下一个帖子
标签: oracle sql
Criteria criteria = ConUtils.makeCri(request);
Sql sql = Sqls.create("select count(*) as count,C_SNAME as serviceName from $table $condition group by C_SNAME");
sql.setCallback(Sqls.callback.records());
sql.vars().set("table", "T_WD_SERVICE_CLOG");
sql.setCondition(cri);
sql.setPager(pager);
dao.execute(sql);

使用上述代码request中传递的是日期参数,控制台输出的sql是:

select count(*) as count,C_SNAME as serviceName from T_WD_SERVICE_CLOG  WHERE (c_call_time <= '2016-05-26 00:00:00') AND (c_call_time >= '2016-05-23 00:00:00') group by C_SNAME;

报错ORA-01861: 文字与格式字符串不匹配
但是我用dao.query(XXX.class, cri,pager);这种形式查询,控制台输出的语句:

SELECT * FROM T_WD_SERVICE_CLOG  WHERE (C_CALL_TIME <= '2016-05-26 00:00:00') AND (C_CALL_TIME >= '2016-05-17 00:00:00');

形式是一样的,但是这个就能正常的显示出查询内容,而且上边两个sql在plsql里均不能执行。
求解我在拼sql是时间参数应该怎么添加进去呢?

10 回复

日期传date对象,不要传字符串

@wendal 但是这里我拼接查询条件时Criteria criteria = ConUtils.makeCri(request);用的就是date啊

public static SqlExpressionGroup buildDtCondition(String conName, String conType, Object value) {
Criteria cri = Cnd.cri();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/** 目前只支持这种日期格式*/
Date date = null;
try {
	date = sdf.parse(value.toString());
} catch (ParseException e) {
	e.printStackTrace();
}
if (conType.equalsIgnoreCase("START")) {
	return cri.where().and(conName, ">=", date);
} else if (conType.equalsIgnoreCase("END")) {
	Calendar c = Calendar.getInstance();
	c.setTime(date);
	c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);
	return cri.where().and(conName, "<=", c.getTime());
} else if (conType.equalsIgnoreCase("EQ")) {
	Calendar c = Calendar.getInstance();
	c.setTime(date);
	c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) + 1);
	return cri.where().and(conName, ">=", date).and(conName, "<=", c.getTime());
}
return null;
}

拼好之后使用sql.setCondition(cri);把查询条件加入到sql里

@lizqing 数据库里面的字段类型是什么

oracle什么版本,驱动也换成最新的试试

@wendal 数据库是这个版本Oracle Database 12c Enterprise Edition Release 12.1.0.2.0;
不过说起版本,我现在使用的nutz版本是1.b.48的,这里有影响吗,主要是这个版本里dao.query(XXX.class, cri,pager);这里不能加group by我才用了自己拼sql的方式,请问直接换成最新版的jar包对项目整体会有什么影响吗?

试试这样写,直接用Static类拼入一个查询条件

cri.where().and(new Static(conName+" >= todate('xxxx-xx-xx xx:xx:xxx')");

@wendal 可以可以,真神啊,大写的服。。。

记得用Sqls.escapeXXX方法对不可信的数据进行抹除.

PS: 我觉得是因为驱动版本低

@wendal 哦哦,谢谢大神提醒

添加回复
请先登陆
回到顶部