【问题标题】:Testing the Oracle to_date function测试 Oracle to_date 函数
【发布时间】:2011-07-26 12:01:33
【问题描述】:

我正在使用 GORM 在 Grails 中编写集成测试。

我想做如下的事情:

delete from Statistic 
where stat_date = TO_DATE(:month_year, 'MON-YYYY')

但我收到以下错误:

java.sql.SQLException: Unexpected token: TO_DATE in statement [delete 来自stat_date=TO_DATE(?, 'MON-YYYY')]的统计数据]

我认为错误是由于GORM使用的内存数据库(是H2吗?)不支持to_date函数。

关于如何编写删除 SQL 以使其在测试和实时运行中的任何想法?

因为我只真正关心月份和年份,所以我认为我会删除 stat_date 在给定月份的第一个和最后一个日期之间的记录。

谁能想到更好的办法?

【问题讨论】:

    标签: oracle testing grails grails-orm


    【解决方案1】:

    这仍然是谷歌搜索的第一名,所以这对我有用。

    我的单元测试/本地环境使用 sql 文件构建和填充架构。我在 sql 文件中创建了以下别名

    -- TO_DATE 
    drop ALIAS if exists TO_DATE; 
    CREATE ALIAS TO_DATE as '
    import java.text.*;
    @CODE
    java.util.Date toDate(String s, String dateFormat) throws Exception { 
      return new SimpleDateFormat(dateFormat).parse(s); 
    } 
    ';
    

    注意h2 user defined functions 中使用单引号而不是 $$,因为这是唯一适合我的格式。

    【讨论】:

    • 我不是作者,但我会说这是正确的答案。因为选择的答案建议修改 SQL,但是,如果您使用 H2 进行单元测试,您将不会更改代码以使您的测试用例工作。
    【解决方案2】:

    我不得不调整 bluesman 的答案,以使其适用于我们的 Oracle sql 中常用的日期格式。

    此版本支持“DD-MON-YYYY”等日期格式

    -- TO_DATE
    drop ALIAS if exists TO_DATE;
    CREATE ALIAS TO_DATE as '
    import java.text.*;
    @CODE
    java.util.Date toDate(String s, String dateFormat) throws Exception {
      if (dateFormat.contains("MON")) {
          dateFormat = dateFormat.replace("MON", "MMM");
      }
      if (dateFormat.contains("Y")) {
          dateFormat = dateFormat.replaceAll("Y", "y");
      }
      if (dateFormat.contains("D")) {
          dateFormat = dateFormat.replaceAll("D", "d");
      }
      return new SimpleDateFormat(dateFormat).parse(s);
    }
    ';
    

    我发现这篇博文 http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ 中的提示有助于弄清楚如何将 Oracle 日期格式转换为 SimpleDateFormat 的格式。

    【讨论】:

      【解决方案3】:

      是的,H2 不支持 TO_DATE,它位于 1.4.x roadmap。相反,您可以使用 Oracle DB 和 H2 中都存在的 EXTRACT 函数。

      【讨论】:

      • 太好了,效果很好,感谢指点。
      【解决方案4】:
      java.util.Date toDate(String dateTime, String dateFormat) throws Exception {
          if (dateFormat.contains("MON")) {
              dateFormat = dateFormat.replace("MON", "MMM");
          }
          if (dateFormat.contains("Y")) {
              dateFormat = dateFormat.replaceAll("Y", "y");
          }
          if (dateFormat.contains("D")) {
              dateFormat = dateFormat.replaceAll("D", "d");
          }
          if (dateFormat.contains("HH")) {
              dateFormat = dateFormat.replaceAll("HH", "hh");
          }
          if (dateFormat.contains("hh24")) {
              dateFormat = dateFormat.replaceAll("hh24", "hh");
          }
          if (dateFormat.contains("MI") || dateFormat.contains("mi")) {
              dateFormat = dateFormat.replaceAll("MI", "mi").replaceAll("mi", "mm");
          }
          if (dateFormat.contains("SS")) {
              dateFormat = dateFormat.replaceAll("SS", "ss");
          }
          return new SimpleDateFormat(dateFormat).parse(dateTime);
      }
      

      【讨论】:

      • 考虑解释您的代码,我们尽量让问题对遇到类似问题的每个人都有用。
      【解决方案5】:

      或者你可以定义你自己的 TO_DATE 像

          CREATE ALIAS TO_DATE AS $$
      java.util.Date to_date(String value, String format) throws java.text.ParseException {
      
      java.text.DateFormat dateFormat = new  java.text.SimpleDateFormat(format);
          return dateFormat.parse(value);
      }
      $$;
      

      见http://www.h2database.com/html/features.html#user_defined_functions

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 2012-07-28
        • 2011-10-28
        • 1970-01-01
        • 2020-11-24
        • 1970-01-01
        相关资源
        最近更新 更多