使用 JOOQ 在 PostgreSQL 中以秒为单位查找和求和时间戳之间的差异

Posted

技术标签:

【中文标题】使用 JOOQ 在 PostgreSQL 中以秒为单位查找和求和时间戳之间的差异【英文标题】:Find and sum difference between timestamps in seconds in PostgreSQL using JOOQ 【发布时间】:2019-01-28 09:58:42 【问题描述】:

这是我的另一个问题 (Find difference between timestamps in seconds in PostgreSQL using JOOQ) 的后续问题。

我想以秒为单位求和 TIMETRACKS.ENDTIMETIMETRACKS.STARTTIME 的差异。数据库中可能不会有任何TIMETRACKS。在这种情况下,数据库应该返回 0

TIMETRACKS 表是这样的:

CREATE TABLE "TimeTracks" (
    "id" uuid PRIMARY KEY,
    "startTime" timestamp NOT NULL,
    "endTime" timestamp,
);

这是我尝试过的一种解决方案:

coalesce(sum(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME)), 0)

但是,coalesce 不适用于区间类型: org.postgresql.util.PSQLException: ERROR: COALESCE types interval and integer cannot be matched

我在 *** 上找到的Another solution 实际上对我有用,但似乎有点“复杂”,因为我必须编写一些原始 SQL:

coalesce(sum(extractEpochFrom(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME))), 0)

fun extractEpochFrom(field: Field<DayToSecond>): Field<Integer> =
    DSL.field("extract(epoch from 0)", Integer::class.java, field)

是否有不需要我编写原始 SQL 的可行解决方案?

【问题讨论】:

您已经找到了适合您的解决方案。恐怕目前没有更好的解决方案。所以,你不妨把你的解决方案作为你自己问题的答案 虽然目前的解决方案不是什么大问题,但未来有支持它的计划吗? 是的! github.com/jOOQ/jOOQ/issues/2132。我现在正在做这件事。肯定会优先考虑DatePart.EPOCH。 (刚刚意识到有 ,实际上在 jOOQ 3.11 中已经对此进行了实验性支持) 【参考方案1】:

目前唯一可行的解​​决方案是使用 here 中的纯 SQL。

coalesce(sum(extractEpochFrom(timestampDiff(TIMETRACKS.ENDTIME, TIMETRACKS.STARTTIME))), 0)

fun extractEpochFrom(field: Field<DayToSecond>): Field<Integer> =
    DSL.field("extract(epoch from 0)", Integer::class.java, field)

【讨论】:

【参考方案2】:

目前 (jOOQ 3.11) 实验性支持额外的非标准 DatePart 类型,例如 DatePart.EPOCH。它可能已经适用于 PostgreSQL,但不适用于其他数据库。

此支持将在未来版本中得到改进,包括 jOOQ 3.12,请参阅:https://github.com/jOOQ/jOOQ/issues/7794

【讨论】:

【参考方案3】:
COALESCE(SUM(extract (epoch from (activities.finished_at - activities.started_at)/3600)))

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于使用 JOOQ 在 PostgreSQL 中以秒为单位查找和求和时间戳之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何在jquery中以秒为单位获取两个日期之间的差异?

如何在 PHP 中以毫秒为单位获取当前时间?

以秒为单位将数字拆分为天、小时、分钟和秒?

SQL Datediff 以秒为单位,带小数位

php 以秒为单位分析内存使用运行时间

返回要使用 AudioTrack 播放的曲目的长度(以秒为单位)