我正在尝试按日期格式字段过滤列表。
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 :(得分: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