当前位置: 首页 > 知识库问答 >
问题:

如何使用HQL(Hibernate)查询日期的平均差异(以天为单位)?

谭昊乾
2023-03-14

我需要从使用Hibernate映射到Java的PostgreSQL数据库中检索记录的平均日期差(您可能会说开始和结束)。

我编写了一个本机PostgreSQL查询,效果很好:

SELECT avg(date_part('days', age(datasaida, dataentrada))) as avg_days
  FROM processo.processo
  WHERE processo.codsituacao = '14'
  AND processo.dataEntrada >=  now() - interval '30 days';

问题是,由于avg(date\u part('days',age(datasaida,dataentrada))部分的原因,我无法理解如何将此查询转换为HQL(Hibernate SQL)。

我需要在前端显示信息,这是我用JSF Primeface构建的。

备注:dataEntrada-指起始日期(种类)。dataSaida表示结束日期(种类)

共有2个答案

洪增
2023-03-14

您可以在HQL中使用函数('function_name',param1,param2)来调用本机Postgresql函数:

SELECT avg(function('date_part', 'days', function('age', datasaida, dataentrada))) as avg_days
  FROM processo.processo
  WHERE processo.codsituacao = '14'
  AND processo.dataEntrada >=  now() - interval '30 days';

有关更多详细信息,您可以查看Hibernate with PostgreSQL教程的调用PostgreSQL特定SQL函数部分–您需要知道的6件事。

索嘉胜
2023-03-14

你可以试试

avg(DAY(function('age', datasaida, dataentrada)))

or

avg(DAY(datasaid - dataentrada))

DAY是标准的JPA功能:http://www.objectdb.com/java/jpa/query/jpql/date

使用函数('age',datasaida,dataentrada),您可以从JPA调用特定于数据库的函数

 类似资料:
  • 问题内容: 我有一列的数据像 我需要编写一个SQL查询/过程,这将有助于我获取日期之间差异的平均值。对于上面的示例,它将是 (19 + 8 + 10)/3=12.33。 请提供帮助。 在此先感谢Geetha 问题答案: 我不知道您的RDBMS,但这是来自SQL Server。另外,您的计算之一是错误的-02/09/2011-13/08/2011是20,而不是19。 产生的结果是12.667:(20

  • 我有一个实体,它有一个表示上次活动的日期对象。我想查询一下平均空闲时间。因此在SQL中,类似于: 我试着这样算了一下差别: 我如何以日期/时间差(以秒为单位)来表示这个平均值?

  • 我正在尝试使用QueryDSL计算平均日期差异。 我还尝试了其他方法,例如使用,但它没有返回正确的值。如果我们想要获得以秒为单位的日期差异,我们似乎需要找到一些方法来调用数据库特定的日期/时间差函数,而不仅仅是使用减号。 遗憾的是,在JPQL中计算日期差异似乎是不可能的,所以我想querydsl-jpa在这方面也有限制。因此,我们必须编写一个本机SQL查询,或者找到一些黑客来让QueryDSL生成

  • 我试图以天计算两个日期之间的差异。然而,当两个日期在不同的月份时,前一个月的日子被丢弃。 例如,如果开始日期是3月31日,结束日期是4月1日,则差异为0。 如果两天在同一个月,它工作正常。 提前感谢您的支持。 更新:我想到了如何修复它。除了选择的日期是一个月的最后一天,一切都按预期进行。可以在下面找到一个实时演示: 这里的演示 例如,开始日期:3月19日,结束日期:3月21日。差2天。 但当选择的

  • 我需要中的结果(即天数)。 这一行抛出一个异常,其中包含以下堆栈跟踪:

  • 问题内容: 必须有一种更简单的方法来执行此操作。我有想要经常刷新的对象,因此我想记录它们的创建时间,对照当前时间戳进行检查,并根据需要刷新。 事实证明datetime.datetime很困难,我也不想深入ctime库。这样的事情有什么容易的吗? 问题答案: 如果要计算两个已知日期之间的差异,请使用以下方法: 86400.0 0