Извлечение поля метки времени в Oracle против MySQL из Grails-Groovy - PullRequest
0 голосов
/ 09 января 2012

Я использую grails / groovy, и из моего контроллера я в настоящее время делаю это для извлечения поля из таблицы Mysql, содержащей поле datetime

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, чтобы независимо от того, какая это база данных, у нас была дата и время в одном и том же формате.

Ответы [ 2 ]

2 голосов
/ 12 января 2012

По нескольким причинам (одна из которых заключается в том, чтобы кодировать базу данных независимо - что, в принципе, вам и нужно ;-)), лучше избегать создания операторов 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 Query Language). Я всегда старался избегать написания простого SQL.

1 голос
/ 09 января 2012

В Oracle даты имеют свой собственный тип, они не являются строками.Если у вас есть строка, вы должны преобразовать ее в дату, используя функцию TO_DATE.

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

Чтобы она работала также в MySQL, вы можете создать хранимую функцию с именем TO_DATE, которая просто возвращаетего первый аргумент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...