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(...)
以防您需要纪元来计算两个时间戳之间的毫秒差。
有一种语法允许将时间戳转换为各种日期部分,包括 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(...)
以防您需要纪元来计算两个时间戳之间的毫秒差。