【问题标题】:jOOQ "EXTRACT(EPOCH FROM [field])" workaround?jOOQ“提取(EPOCH FROM [field])”解决方法?
【发布时间】:2017-06-19 15:52:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果问题出在EPOCH 上,您可以尝试提取DAY 并将其乘以60*60*24?..
  • 这样我会失去很多精确度。
  • (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()) 完全相同 - 看到我的答案了吗?..
  • 如果你可以使用任何函数,你可以调用date_part('epoch', "ts")来代替(它们在PostgreSQL中是一样的)。

标签: sql postgresql jooq


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我敢肯定,那时应该没有那么可怕:

      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
      

      【讨论】:

      • 1: extract() 有一个特殊的语法,它不能接受from 之前的值,只能接受标识符。 2. day 是一个月中的某天,即22017-02-02 的情况下是2017-02-02,而不是epoch
      • 啊。我明白了 - 我认为它不只接受 EPOCH。谢谢
      • 刚刚注意到,您 extract 来自 interval,它是通过减去 2 个时间戳生成的。这是一种特殊情况,它会生成一个具有最大days 分辨率的间隔,因此您的公式可以工作。但通常从时间戳/间隔中提取天数是危险的,考虑 f.ex。 extract(day from interval '2 years 2 days')
      • 是的 - 这就是我总结提取天数的原因nnn 提取小时数nnn 等
      • 啊,而且 9.6 也接受引用的语法(这不是标准的,旧版本不支持它,至少在我上次尝试时它给我抛出了语法错误——文档仍然没有说明它被接受了)。
      猜你喜欢
      • 2014-11-10
      • 2018-03-22
      • 1970-01-01
      • 2018-01-07
      • 2021-05-29
      • 1970-01-01
      • 2018-02-17
      • 2013-08-15
      • 2022-12-02
      相关资源
      最近更新 更多