【问题标题】:How to group by date without time-stamp in hibernate query language?如何在休眠查询语言中按没有时间戳的日期分组?
【发布时间】:2014-04-05 20:33:56
【问题描述】:

我想从按日期分组的表中获取数据,但由于我的日期列数据类型是日期时间。

"select to_char(datePerformed, 'yyyy-mm-dd'), sum(sendAmount) from AppTransaction group by to_char(datePerformed, 'yyyy-mm-dd')"

由于datePerformed带有时间戳,它的组包含时间戳,所以我使用了上面的查询

group by to_char(datePerformed, 'yyyy-mm-dd')"

我遇到了这样的异常,

java.lang.IllegalArgumentException: Cannot format given Object as a Date

我希望这个查询将我的数据集与没有时间戳的数据分组,我该怎么做?

【问题讨论】:

  • 您使用的是哪个数据库?
  • 我正在使用 postgresql 数据库

标签: java mysql sql hibernate postgresql


【解决方案1】:

Here 是我使用 date_trunc 和 Hibernate sqlGroupProjection 的任何可能的 postgres 时间范围的完整解决方案。

public enum PostgresDateTrunc {

    second,
    minute,
    hour,
    day,
    week,
    month,
    quarter,
    year;

    public String getPostgresGroupExpression(String dtField, String alias) {
        return String.format("date_trunc('%s', %s) as %s", name(), dtField, alias);
    }

}

public class GenericRepository {

    public List calculateTimeGroupingStats(PostgresDateTrunc trunc, String timeGroupField, String...calculatedFields) {
        Criteria criteria = createCriteria();
        // adjust criteria object here

        ProjectionList projection = Projections.projectionList().
            add(Projections.alias(Projections.sqlGroupProjection(
                trunc.getPostgresGroupExpression(timeGroupField, "timeGroupField"),
                "timeGroupField", new String[]{"timeGroupField"}, new Type[]{StandardBasicTypes.DATE}),
                "timeGroupField")).
            add(Projections.alias(Projections.rowCount(), "count"));

        for (String calculatedField : calculatedFields) {
            projection.
                add(Projections.alias(Projections.sum(calculatedField), calculatedField + "Sum")).
                add(Projections.alias(Projections.avg(calculatedField), calculatedField + "Avg"));
        }

        criteria.addOrder(Order.asc("timeGroupField"));

        criteria.setProjection(projection);

        return criteria.list();
    }

}

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,这种方法对我有用:

    SELECT to_char(l.launchTime, 'mm-dd-yyyy'), count(l) 
      FROM Launch l 
     GROUP BY to_char(l.launchTime, 'mm-dd-yyyy')
    

    我也试过这个方法,但是不行:

    group by l.launchTime::date
    

    group by cast(l.launchTime as date)
    

    【讨论】:

      【解决方案3】:

      试试:

      group by datePerformed::date
      

      或更好

      group by cast(datePerformed as date)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多