Gorm计数元素按天分组,没有时间

时间:2014-02-11 22:38:15

标签: grails hql gorm grails-2.0

我希望每天检索一次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

3 个答案:

答案 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)

将日期细分为daymonthyear,然后忽略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中都有效。