我有一个包含两个 timestamp
列的表,startTime
和 stopTime
,我想计算这些时间戳的平均差异我的 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/