我正在使用grails / groovy,并且从我的控制器中我正在执行此操作以从包含datetime字段的Mysql表中检索字段
SimpleDateFormat Sformat = new SimpleDateFormat("yyyy-MM-dd");
String format_datenow = Sformat.format(new Date());
String format_dateprevious = Sformat.format(new Date() -31);
String markerCalcQuery =
"select sum(trans_cnt) as t_cnt, location from map2_data where fdate between '"+format_dateprevious+"' and '"+format_dateprevious+"' and res_id = "+res_id+" group by map2_data.location";
res_row=gurculsql.rows(markerCalcQuery);
上述查询在Oracle11g上失败,错误
ORA-01843:不是有效月份。
我觉得错误是因为MySQL以这种格式存储日期:2011-12-28 02:58:26
而Oracle存储的日期如下:28-DEC-11 02.58.26.455000000 PM
如何使代码通用化,一种方法是使Oracle中的数据库以相同的格式存储日期,我正在考虑处理此代码而不是代码。如果是,如何更改Oracle数据库中的日期格式?
我可以在map2_data
的grails域类中指定格式,这样无论它是什么数据库,我们都会以相同的格式生成日期时间。
答案 0 :(得分:2)
由于多种原因(一个是独立于代码数据库 - 这基本上是你需要的;-)),最好避免在代码中创建SQL语句。尝试使用Grails标准DSL,例如
之类的东西def criteria = YourDomainObject.createCriteria()
criteria.get {
between ('fdate', new Date()-31, new Date())
projections {
sum('trans_cnt')
groupProperty('location')
}
}
(证明,但应该帮助你开始)。 如果由于某种原因您无法使用条件API,请尝试回退到HQL(Hibernate查询语言)。我总是试图避免编写纯SQL。
答案 1 :(得分:1)
在Oracle中,日期有自己的类型,它们不是字符串。如果您有字符串,则应使用TO_DATE
函数将其转换为日期。
String format_datenow = "TO_DATE('" + Sformat.format(new Date()) + "', 'YYYY-MM-DD')";
为了使它在MySQL中也能工作,你可以创建一个名为TO_DATE
的存储函数,只返回它的第一个参数。