2014-02-03 5 views
1

Я пытаюсь отфильтровать список по полю формата даты.Grails Фильтрация списка по году

class Timesheet { 

    String orderNumber 
    String groupCode 
    String periodCode 
    BigDecimal totalHours 
    Date importTime 
    Date generationTime // here 
    String description 

И контроллер:

def list = { 
    flash.periodCode = params.periodCode 
    flash.groupCode = params.groupCode 
    flash.orderNumber = params.orderNumber 

    // here 
    flash.generationTime = Date.parse('yyyy-mm-dd hh-mm-ss', params.generationTime) 

    if(!params.max) { 
     params.max = 20 
    } 
    def query 
    def criteria = Timesheet.createCriteria() 
    def results 

    query = { 
     and{ 
      like("periodCode", '%' + params.periodCode + '%') 
      like("groupCode", '%' + params.groupCode + '%') 
      like("orderNumber", '%' + params.orderNumber + '%') 
      like("generationTime", '%' + params.generationTime + '%') 
     } 
    } 

    results = criteria.list(params, query) 

    render(view:'index', model:[ timesheetInstanceList: results ]) 
} 

Дата выглядит следующим образом: 2014-01-02 08:46:14 CET.

То, что я пытаюсь сделать, это поместить текст в текстовое поле типа «2014», а контроллер grails должен найти все записи с датой, включая «2014». Есть ли простой способ сделать это? Исключение, которое я получил это:

Unparseable date: "2013-12-31 08:02:55" 
or 
"java.lang.String cannot be cast to java.util.Date filtering grails" 
+0

Зависит от формата params.generationTime. Однако, если ваша дата выглядит так: «2013-12-31 08:02:55», правильный шаблон: «yyyy-MM-dd hh: mm: ss» – alessandro

+0

В формате GenerationTime есть формат даты. Текст, который я хочу сравнить с этим форматом даты, - это строка, получаемая из текстового поля: Тип ввода = "текст" id = "generationTime" name = "generationTime" value = "$ {flash.generationTime}" И, конечно, вы правильно записываете правильную картину – user3245082

ответ

0

Так простейшие способ сделать это - получить все расписания, которые были созданы между 1 января того же года и 31 декабря того же года.

Сначала вы получите два экземпляр Даты в течение 01/01 $ года/и второго по 31/12/$ года

Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.WEEK_OF_YEAR, 1); 
cal.set(Calendar.DAY_OF_WEEK, 1); 

Date start = cal.getTime(); 

//set date to last day of $year 
cal.set(Calendar.YEAR, year); 
cal.set(Calendar.MONTH, 11); // 11 = december 
cal.set(Calendar.DAY_OF_MONTH, 31); // new years eve 

Date end = cal.getTime(); 

Тогда все, что вам нужно сделать, это запрос даты, которые находятся между начало и конец

query = { 
     and{ 
      like("periodCode", '%' + params.periodCode + '%') 
      like("groupCode", '%' + params.groupCode + '%') 
      like("orderNumber", '%' + params.orderNumber + '%') 
      like("generationTime", '%' + params.generationTime + '%') 
      between('generationTime', start, end) 
     } 
    } 

Одна вещь, которую вы должны заботиться о том, чтобы здесь перекладывать часы и минуты и секунды до 23:59:59

3

Одним из вариантов является использование Derived Property, чтобы создать не-сохранялось generationYear поле, используя выражение SQL. Поскольку это выражение является сырым SQL, синтаксис будет зависеть от конкретной базы данных, но будет следовать этой базовой структуре:

class Timesheet { 
    //... 
    Integer generationYear 

    static mapping = { 
     //...  
     generationYear formula: 'YEAR(generation_time)' 
    } 

Затем вы сможете запросить непосредственно на год:

eq("generationYear", flash.generationTime[Calendar.YEAR]) 
Смежные вопросы