jOOQ "EXTRACT(EPOCH FROM [field])" 解决方法?

jOOQ "EXTRACT(EPOCH FROM [field])" workaround?

有一种语法允许将时间戳转换为各种日期部分,包括 unix 纪元。其工作方式如下(至少在最新的 PostgreSQL 中):

SELECT EXTRACT(EPOCH FROM "ts") FROM...

然而,jOOQ 似乎不支持这种语法,jOOQ github.

上的 this discussion I found, which links to the still open Issue #2132 证明了这一点

有什么解决方法?我如何在 jOOQ 的语法中模拟这种行为(即不必用纯 SQL 编写整个查询)?

我敢肯定那时候应该不会那么可怕:

t=# select
  (extract('DAY' from now()-'1970-01-01')*60*60*24 + extract(seconds from now())+ extract(minutes from now())*60 + extract(hours from now())*60*60)
  -
  extract(epoch from now())
;
 ?column?
----------
        0
(1 row)

Time: 0.315 ms

jOOQ 3.10 及更低版本的解决方法

你总是可以使用 jOOQ plain SQL:

public static Field<Integer> extractEpochFrom(Field<Timestamp> field) {
    return DSL.field("extract(epoch from {0})", Integer.class, field);
}

jOOQ 3.11 及更多版本的支持

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

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

只是想添加 org.jooq.impl.DSL.timestampDiff(...) 以防您需要纪元来计算两个时间戳之间的毫秒差。