Тестирование функции Oracle to_date - PullRequest
9 голосов
/ 26 июля 2011

Я пишу интеграционный тест в Grails с использованием GORM.

Я хочу сделать что-то вроде следующего:

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

Но я получаю следующую ошибку:

java.sql.SQLException: неожиданный токен: TO_DATE в операторе [удалить из статистики, где stat_date = TO_DATE (?, 'MON-YYYY')]

Я думаю, что ошибка вызвана тем, что база данных в памяти, используемая GORM (это H2?), Не поддерживает функцию to_date.

Есть идеи, как написать SQL для удаления, чтобы он работал в тесте и вживую?

Поскольку меня очень заботит только месяц и год, я думал, что мне удастся удалить записи, где stat_date находится между первой и последней датой данного месяца.

Кто-нибудь может придумать лучший способ?

Ответы [ 5 ]

25 голосов
/ 05 июня 2012

Это по-прежнему номер 1 в поиске Google, поэтому вот что сработало для меня.

Мои модульные тесты / локальная среда создают и заполняют схему с использованием файлов 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 пользовательских функциях , поскольку это единственный формат, который работал для меня.

6 голосов
/ 24 августа 2012

Мне пришлось настроить ответ 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.

6 голосов
/ 26 июля 2011

Да, H2 не поддерживает TO_DATE, он находится в 1.4.x дорожной карте .Вместо этого вы можете использовать функцию EXTRACT , которая существует как в Oracle DB, так и в H2.

5 голосов
/ 10 апреля 2014
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);
}
3 голосов
/ 17 апреля 2012

Или вы можете определить свой собственный 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

...