我有一个包含两个timestamp
列,startTime
和stopTime
的表格,我想计算这些时间戳在表格中的平均差异。我有一个适用于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兼容。
答案 0 :(得分:0)
问题的症结在于将日期和时间戳转换为秒数。我将使用朱利安日期作为日期,而不是使用纪元。我将julian日期转换为秒,然后为每个比较的时间戳添加自今晚以来的秒数。以下查询不计算差异,它只是将日期转换为两个平台上相似的数字。对于每个比较日期,您必须执行此操作一次。注意:分别用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或函数。