【问题标题】:Average date difference in QueryDSLQueryDSL 中的平均日期差异
【发布时间】:2015-09-09 07:56:34
【问题描述】:

我有一个带有代表上次活动的 Date 对象的实体。我想查询平均空闲时间。所以在 SQL 中是这样的:

SELECT AVG(NOW() - idle_date) FROM mytable WHERE ....

我尝试这样计算差异:

query.singleResult(
    Expressions.dateOperation(
        Long.class, 
        Ops.DateTimeOps.DIFF_SECONDS,
        DateExpression.currentDate(),
        myTable.idleDate
    )
);

但这不允许我对结果进行平均,只有最小值和最大值。

如何表示日期/时间差的平均值(以秒为单位)?

【问题讨论】:

    标签: jpa querydsl


    【解决方案1】:

    我相信你可以使用NumberTemplate 对象;这些方面的东西应该可以满足您的需求:NumberTemplate.create(Double.class, "AVG(NOW() - {0})", myTable.idleDate);

    【讨论】:

    • 我使用了NumberTemplate.create(Double.class, "{0} - {1}", DateExpression.currentDate(), myTable.idleSince).avg(),效果很好。 (我冒昧地编辑了您的评论,以便将其标记为正确的解决方案)
    • 事实上,这并没有按预期工作。这段代码确实给出了一个数字结果,但它没有意义,而且肯定不是秒数。我尝试将 {0} - {1} 替换为 TIMESTAMPDIFF(SECOND, {1}, {0}) 但这不是 JPA 表达式,因此失败了。
    • idleDate 是表示为java.sql.Timestamp 还是java.sql.Date?如果是java.sql.Timestamp,那么DateTimeExpression.currentDate() 可能会有所帮助。或者,也许可以使用DateTemplate 并在获得Java 端后处理结果。抱歉,这没有成功。
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多