在 JOOQ 中获取间隔总和
Fetching a sum of intervals in JOOQ
我正在寻找一种独立于方言的方法来 return 两个 TIMESTAMP 字段之间的间隔持续时间的总和,使用 select 例如:
DSL.sum(DSL.timestampDiff(MY_TABLE.START, MY_TABLE.END))
在 JOOQ 中,sum(...)
return 是 Field<BigDecimal>
。这恰好适用于 HSQLDB,因为它使用 INTERVAL 的毫秒表示。但是,在 PostgreSQL 中,此查询会崩溃,因为无法从本机 INTERVAL 类型自动转换为 BigDecimal。
我现在正在 JOOQ 中寻找一种跨平台的方式来将 INTERVAL 转换为(毫秒)秒,这样我就可以将这些数字相加为一个数值。
有什么建议吗? (或者也许有更优雅的方法来解决这个难题?)
select extract ('epoch' from '5 days 5 hours'::interval);
这可能是 jOOQ (#5785) 中的错误。
作为解决方法,您可以像这样实现自己的求和函数:
public static Field<BigDecimal> sumTimestampDiff(
final Field<Timestamp> start,
final Field<Timestamp> end
) {
return new CustomField<BigDecimal>("sum", SQLDataType.NUMERIC) {
@Override
public void accept(Context<?> ctx) {
switch (ctx.family()) {
case HSQLDB:
ctx.visit(sum(timestampDiff(start, end)));
break;
case POSTGRES:
ctx.visit(sql("sum(1000 * extract('epoch' from ({0} - {1})))",
start, end));
break;
}
}
};
}
我正在使用 。
以上代码片段假定您有此静态导入:
import static org.jooq.impl.DSL.*;
我正在寻找一种独立于方言的方法来 return 两个 TIMESTAMP 字段之间的间隔持续时间的总和,使用 select 例如:
DSL.sum(DSL.timestampDiff(MY_TABLE.START, MY_TABLE.END))
在 JOOQ 中,sum(...)
return 是 Field<BigDecimal>
。这恰好适用于 HSQLDB,因为它使用 INTERVAL 的毫秒表示。但是,在 PostgreSQL 中,此查询会崩溃,因为无法从本机 INTERVAL 类型自动转换为 BigDecimal。
我现在正在 JOOQ 中寻找一种跨平台的方式来将 INTERVAL 转换为(毫秒)秒,这样我就可以将这些数字相加为一个数值。
有什么建议吗? (或者也许有更优雅的方法来解决这个难题?)
select extract ('epoch' from '5 days 5 hours'::interval);
这可能是 jOOQ (#5785) 中的错误。
作为解决方法,您可以像这样实现自己的求和函数:
public static Field<BigDecimal> sumTimestampDiff(
final Field<Timestamp> start,
final Field<Timestamp> end
) {
return new CustomField<BigDecimal>("sum", SQLDataType.NUMERIC) {
@Override
public void accept(Context<?> ctx) {
switch (ctx.family()) {
case HSQLDB:
ctx.visit(sum(timestampDiff(start, end)));
break;
case POSTGRES:
ctx.visit(sql("sum(1000 * extract('epoch' from ({0} - {1})))",
start, end));
break;
}
}
};
}
我正在使用
以上代码片段假定您有此静态导入:
import static org.jooq.impl.DSL.*;