jOOQ“提取(EPOCH来自[字段])”解决方法?

时间:2017-02-02 14:17:44

标签: sql postgresql jooq

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

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

但是,jOOQ似乎不支持这种语法,我发现this discussion证明了这一点,它链接到jOOQ github上仍然打开的Issue #2132

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

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我确定应该有更少的怪物:

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