Grails按年份过滤列表

时间:2014-02-03 10:21:38

标签: grails groovy

我正在尝试按日期格式字段过滤列表。

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"

2 个答案:

答案 0 :(得分:3)

一种选择是使用Derived Property使用SQL表达式创建非持久generationYear字段。由于此表达式是原始SQL,因此语法将取决于您的特定数据库,但将遵循以下基本结构:

class Timesheet {
    //...
    Integer generationYear

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

然后您就可以直接查询年份:

eq("generationYear", flash.generationTime[Calendar.YEAR])

答案 1 :(得分:0)

因此,最简单的方法是获取在当年1月1日至同年12月31日之间创建的所有时间表。

首先,你会在01/01 / $年获得两个Dates实例,第二个是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