【问题标题】:Extracting timestamp field in Oracle vs MySQL from Grails-Groovy从 Grails-Groovy 中提取 Oracle vs MySQL 中的时间戳字段
【发布时间】:2012-01-08 21:26:43
【问题描述】:

我正在使用 grails/groovy,并且从我的控制器中我目前正在这样做以从包含日期时间字段的 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 数据库中的日期格式?

我能否在 grails 域类中为 map2_data 指定格式,这样无论它是什么数据库,我们都将拥有相同格式的日期时间。

【问题讨论】:

    标签: oracle datetime grails groovy


    【解决方案1】:

    出于几个原因(一个是独立于数据库的代码 - 这基本上是您需要的 ;-)),最好避免在代码中创建 SQL 语句。尝试使用 Grails 标准 DSL,例如像

    def criteria = YourDomainObject.createCriteria()
    criteria.get {
        between ('fdate', new Date()-31, new Date())
        projections {
            sum('trans_cnt')
            groupProperty('location')
        }
    }
    

    (经过测试,但应该可以帮助您入门)。 如果由于某种原因您不能使用条件 API,请尝试回退到 HQL(休眠查询语言)。我总是尽量避免编写简单的 SQL。

    【讨论】:

    • 如何获得 sum(trans_cnt) 的别名?在任何地方都找不到示例
    【解决方案2】:

    在 Oracle 中,日期有自己的类型,它们不是字符串。如果您有一个字符串,您应该使用TO_DATE 函数将其转换为日期。

    String format_datenow = "TO_DATE('" + Sformat.format(new Date()) + "', 'YYYY-MM-DD')";
    

    为了让它在 MySQL 中也能工作,你可以创建一个名为 TO_DATE 的存储函数,它只返回它的第一个参数。

    【讨论】:

    • 您好,我们不能在我们的实现中使用存储函数或过程。这使得这个解决方案只特定于oracle,是否有一种通用的方法来处理日期是mysql和oracle。
    • 问题仍然存在,因为我无法在 mysql 中使用存储函数或过程..对于我的实现...是否有其他方法可以使其通用化?
    • 在您的 Groovy 代码中,编写一个函数 formatDate(str),根据 DB,它将返回其参数或“TO_DATE(...”。您需要一个包含这些函数的库无论如何,如果您要发出直接查询,因为这不是这些数据库不同的唯一方式。
    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2018-10-19
    • 2015-11-20
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多