【发布时间】:2016-10-12 01:05:46
【问题描述】:
所以我尝试使用 mysql datediff 函数来获取发票过期的平均天数。
我的查询如下所示:
select avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp)) from invoice i
where i.createdTimestamp >= DATE_VARIABLE_HERE and (invoiceStatus = 'TEXT_HERE' or nullableDateTimeColumn is not null)
我实际的 spring 数据 repo 定义如下所示:
@Repository
interface InternalInvoiceRepository extends PagingAndSortingRepository<Invoice, Long> {
@Query(value = "select avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp)) from invoice i " +
"where i.createdTimestamp >= ?1 " +
"and (invoiceStatus = 'TEXT_HERE' or nullableDateTimeColumn is not null)", nativeQuery = true)
BigDecimal getAverageTimeInvoiceEntryTimeForInvoicesNewerThan(LocalDateTime time);
}
问题是结果始终为空,我尝试将返回类型设置为双精度,但也没有用。如果我将log4j.logger.org.hibernate.SQL 设置为DEBUG 并查看sql,则sql 是正确的。如果我运行 sql 我会得到一个数字,所以我知道 hibernate 正在运行的 sql 实际上正在返回一个结果。返回的值非常小,通常在 0-5 之间,所以它不是什么奇怪的溢出错误或类似的东西。这似乎是一个简单的场景,所以我有点困惑为什么这不起作用。
版本:
Spring data: 1.9.2.RELEASE
Spring: 4.2.4.RELEASE
Hibernate: 5.0.7.Final
hibernate-jpa-2.1-api: 1.0.0.Final
【问题讨论】:
-
查询执行时,日期如何出现在日志中?
-
@ScaryWombat 我只展示了 repo 的一部分,还有很多其他方法,但它们与这个问题没有任何关系
-
你能确认
i.createdTimestamp是Timestamp还是Date数据类型。 -
@djointster 这里是跟踪记录的结果:01:16:34,628 [http-bio-8080-exec-43] TRACE org.hibernate.type.descriptor.sql.BasicBinder: - 绑定参数 [1] 作为 [VARBINARY] - [2016-10-01T00:00] 01:16:34,720 [http-bio-8080-exec-43] TRACE org.hibernate.type.descriptor.sql.BasicExtractor: - 提取值([avg(datediff(coalesce(nullableDateTimeColumn, now()), i.createdTimeStamp))] : [NUMERIC]) - [null]
-
@AppHouze i.CreatedTimestamp 是 DB 中的 DateTime,在代码中映射到 java.time.LocalDateTime
标签: java spring hibernate spring-data spring-data-jpa