从Grails-Groovy中提取Oracle与MySQL中的时间戳字段

时间:2012-01-08 21:26:44

标签: oracle datetime grails groovy

我正在使用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域类中指定格式,这样无论它是什么数据库,我们都会以相同的格式生成日期时间。

2 个答案:

答案 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的存储函数,只返回它的第一个参数。