我希望每天检索一次UserProfile注册。 域对象UserProfile存储Date creationDate属性。 我试过了
def results = UserProfile.executeQuery('select u.creationDate, count(u) from UserProfile as u group by u.creationDate')
println results
这显然不是我需要的,因为数据已经(已经)存储了完整的时间。
任何精通资源的解决方案都适合:projection,hql,...
Thnks
答案 0 :(得分:2)
我使用HQL强制转换函数:
def results = UserProfile.executeQuery("""
select cast(u.creationDate as date), count(u)
from UserProfile as u
group by cast(u.creationDate as date)
""")
底层数据库必须支持ANSI强制转换(... as ...)语法才能工作,PostgreSQL,MySQL,Oracle,SQL Server和许多其他DBMS就是这种情况
答案 1 :(得分:0)
将日期细分为day
,month
和year
,然后忽略timestamp
。
这应该可以满足您的需求。
def query =
"""
select new map(day(u.creationDate) as day,
month(u.creationDate) as month,
year(u.creationDate) as year,
count(u) as count)
from UserProfile as u
group by day(u.creationDate),
month(u.creationDate),
year(u.creationDate)
"""
//If you do not worry about dates any more then this should be enough
def results = UserProfile.executeQuery( query )
//Or create date string which can be parsed later
def refinedresults =
results.collect { [ "$it.year-$it.month-$it.day" : it.count ] }
//Or parse it right here
def refinedresults =
results.collect {
[ Date.parse( 'yyyy-MM-dd', "$it.year-$it.month-$it.day" ) : it.count ]
}
答案 2 :(得分:0)
您可以将"derived" property定义为公式,以提取日期和时间的日期部分。确切的公式将根据您使用的DB而有所不同,对于MySQL,您可以使用类似
的内容Date creationDay // not sure exactly what type this needs to be, it may need
// to be java.sql.Date instead of java.util.Date
static mapping = {
creationDay formula: 'DATE(creation_date)'
}
(该公式使用DB列名而不是GORM属性名)。现在,您可以按creationDay
而不是creationDate
进行分组,它应该按照您的需要进行分组。
或者不是“日期”,您可以使用其他答案中建议的年,月和日的单独字段,我认为这些函数在H2和MySQL中都有效。