所以我正在尝试使用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)
我的实际弹簧数据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);
}
问题是结果总是为null,我尝试将返回类型设置为double但这也不起作用。如果我将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
答案 0 :(得分:0)
这适用于Oracle。它可能对你有帮助。
SELECT avg(TO_NUMBER(TO_CHAR(ADD_MONTHS(
(coalesce(nullableDateTimeColumn, SYSDATE)), TO_CHAR(i.createdTimeStamp, MM')), 'YYYYMMDD')))
FROM invoice i
WHERE i.createdTimeStamp >= '20160401' -- for example
AND ( invoiceStatus = 'TEXT_HERE'
OR nullableDateTimeColumn IS NOT NULL )
参考here