在 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 转换为(毫秒)秒,这样我就可以将这些数字相加为一个数值。

有什么建议吗? (或者也许有更优雅的方法来解决这个难题?)

来自the lists

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.*;

More info about CustomField here.