【问题标题】:SELECT average timestamp difference in JPA with Postgres and HSQL使用 Postgres 和 HSQL 在 JPA 中选择平均时间戳差异
【发布时间】:2026-01-20 14:30:01
【问题描述】:

我有一个包含两个timestampstartTimestopTime 的表,我想计算表中这些时间戳的平均差异。我有一个适用于 Postgres 和 HSQLDB(我用于本地单元测试)的解决方案,但不能同时适用于两者,我在试图找出一个通用解决方案时遇到了麻烦。

Postgres:

 select EXTRACT(EPOCH FROM(avg(m.stopTime - m.startTime))) from Measures m 

HSQL:

 select avg(FUNC('UNIX_TIMESTAMP', m.stopTime) - FUNC('UNIX_TIMESTAMP', m.startTime) from Measures m

有没有办法对两个数据库使用相同的查询?我发现的所有功能似乎都只在一个数据库中受支持。

我认为我的主要问题是没有通用函数将时间戳转换为秒以执行计算。 EPOCH 只兼容 Postgres,UNIX_TIMESTAMP 只兼容 HSQL。

【问题讨论】:

  • 看起来是 JPQL 的完美案例
  • 这是我的问题,我一直无法找到允许我这样做的 JPQL 语法。
  • 最好使用 same RDBMS 进行测试和生产。
  • 我们想使用内存数据库进行隔离的、较低级别的单元测试,以避免与外部接口建立连接,但我了解您的来源。在这个级别,我们更专注于测试应用程序逻辑。

标签: sql postgresql jpa eclipselink hsqldb


【解决方案1】:

问题的症结在于将日期和时间戳转换为秒数。我将不使用纪元,而是使用儒略日期作为日期。我会将儒略日期转换为秒,然后为每个被比较的时间戳添加自 minight 以来的秒数。以下查询不计算差异,它只是将日期转换为两个平台上相似的数字..您必须为每个要比较的日期执行一次。注意:将 "current"timestamp" 分别替换为 m.startTime 和 m.stopTime。

select 
(to_number(to_char(current_timestamp,'J'),'99999999999999999999')*86400/*convert from julian days to julian seconds*/) 
       + (to_number(to_char(current_timestamp,'HH'),'99') * 3600) /*Hours to seconds */
       +  (to_number(to_char(current_timestamp,'MM'),'99') * 60) /*Minutes to seconds */
       +  (to_number(to_char(current_timestamp,'SS'),'99') /*add in the seconds*/

丑得像罪,我知道——也许你可以更容易地将它重写为函数,但由于我不知道 hsqls 的完整功能集,所以我将其保留为这种形式,而不是使用 CTE 或函数。

【讨论】:

  • 感谢您强调这里的问题实际上是将时间戳转换为秒数,我可能在原始帖子中没有很好地沟通。我希望 JPA 有一些等效的 EPOCH/UNIX_TIMESTAMP 函数......不过,这是一个创造性的解决方案。
  • 我认为重点是编写可以在 hsql 和 postgresql 上运行的代码
  • 现在我根据我正在使用的持久性单元更改查询......这个解决方案似乎有点笨重,我希望有一些更清洁的东西。
最近更新 更多