sql - 使用 Postgres 和 HSQL 在 JPA 中选择平均时间戳差异

标签 sql postgresql jpa eclipselink hsqldb

我有一个包含两个 timestamp 列的表,startTimestopTime,我想计算这些时间戳的平均差异我的 table 。我有一个适用于 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 兼容。

最佳答案

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

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*/

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

关于sql - 使用 Postgres 和 HSQL 在 JPA 中选择平均时间戳差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302045/

相关文章:

sql - 除以两个数字时,sql数据类型错误

sql - 如何创建动态表

SQL组合多个标识符为重复记录创建一个组ID

java - 如何在 servlet 级别捕获 OptimisticLockException?

java - sql java 查询

c# - 连接可变数量的字符串

sql - 为什么我们使用 `As foo (geom)` 而不是 `As geom`

postgresql - 尝试运行创建扩展 postgis 时出错

java - JPA EclipseLink 自定义实体/对象作为 IN 参数

bash - 在 bash 部署中将初始用户插入到我的数据库中