测试Oracle to_date函数

C0d*_*ack 9 testing oracle grails grails-orm

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

我想做类似以下的事情:

delete from Statistic 
where stat_date = TO_DATE(:month_year, 'MON-YYYY')
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:

java.sql.SQLException:意外的标记:语句中的TO_DATE [从统计信息中删除stat_date = TO_DATE(?,'MON-YYYY')]

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

有关如何编写删除SQL的任何想法,以便它在测试和实时工作?

因为我只关心月份和年份,我认为我将删除stat_date在给定月份的第一个和最后一个日期之间的记录.

任何人都可以想到更好的方法吗?

blu*_*man 25

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

我的单元测试/本地环境使用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); 
} 
';
Run Code Online (Sandbox Code Playgroud)

请注意在h2用户定义的函数中使用单引号而不是$$,因为这是唯一适用于我的格式.


Lev*_*ich 6

是的,H2不支持TO_DATE,它在1.4.x路线图中.相反,您可以使用Oracle DB和H2中存在的EXTRACT函数.


Pau*_*den 6

我必须调整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);
}
';
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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);
}
Run Code Online (Sandbox Code Playgroud)