代码之家  ›  专栏  ›  技术社区  ›  Kruschenstein rico

约克日均飞秒

  •  1
  • Kruschenstein rico  · 技术社区  · 6 年前

    我试图用jooq在嵌套请求中对timestamp字段执行平均值。除了约克不能皈依外,我几乎完了。 DayToSecond 键入到 BigDecimal 因为它的转换基于 飞秒 字符串表示和 飞秒 看起来像:

    00:00:55.646

    因此无法完成转换并引发异常。

    我用了乔克 3.11.2条

    这是桌子:

    CREATE TABLE IF NOT EXISTS MISSION (
      ID         SERIAL PRIMARY KEY,
      START_DATE TIMESTAMP,
      SOLVE_DATE TIMESTAMP);
    

    这就是约克的要求:

    Field<DayToSecond> SPEED = field("SPEED", DayToSecond.class);
    Table<Record1<DayToSecond>> nested =
            context.select(
                    timestampDiff(Tables.MISSION.SOLVE_DATE,
                                  Tables.MISSION.START_DATE)
                                    .as(SPEED))
                            .from(Tables.MISSION_USER)
                            .asTable();
    context.select(
            avg(nested.field(SPEED)).as("avg"), // Error with this line
            max(nested.field(SPEED)).as("max"),
            min(nested.field(SPEED)).as("min"))
        .from(nested)
        .fetchOne().into(Efficiency.class);
    

    效率类是一个pojo,有3个int字段(avg、max、min)。

    这是StackTrace:

        Request processing failed; nested exception is org.springframework.jdbc.UncategorizedSQLException: jOOQ; uncategorized SQLException for SQL [select avg("alias_89583003"."SPEED") as "avg", max("alias_89583003"."SPEED") as "max", min("alias_89583003"."SPEED") as "min" from (select ("public"."mission"."solve_date" - "public"."mission"."start_date") as "SPEED" from "public"."mission") as "alias_89583003"]; SQL state [null]; error code [0]; Error while reading field: "avg", at JDBC index: 1; nested exception is java.sql.SQLException: Error while reading field: "avg", at JDBC index: 1] with root cause
    org.postgresql.util.PSQLException: Mauvaise valeur pour le type BigDecimal : 00:00:55.646
        at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2885)
        at org.postgresql.jdbc.PgResultSet.toBigDecimal(PgResultSet.java:2894)
        at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:2353)
        at org.postgresql.jdbc.PgResultSet.getBigDecimal(PgResultSet.java:396)
        at org.jooq.tools.jdbc.DefaultResultSet.getBigDecimal(DefaultResultSet.java:323)
        at org.jooq.impl.CursorImpl$CursorResultSet.getBigDecimal(CursorImpl.java:695)
        at org.jooq.impl.DefaultBinding$DefaultBigDecimalBinding.get0(DefaultBinding.java:1363)
        at org.jooq.impl.DefaultBinding$DefaultBigDecimalBinding.get0(DefaultBinding.java:1326)
        at org.jooq.impl.DefaultBinding$AbstractBinding.get(DefaultBinding.java:774)
        at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.setValue(CursorImpl.java:1720)
        at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1689)
        at org.jooq.impl.CursorImpl$CursorIterator$CursorRecordInitialiser.operate(CursorImpl.java:1654)
        at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:125)
        at org.jooq.impl.CursorImpl$CursorIterator.fetchNext(CursorImpl.java:1618)
        at org.jooq.impl.CursorImpl$CursorIterator.hasNext(CursorImpl.java:1585)
        at org.jooq.impl.CursorImpl.fetchNext(CursorImpl.java:407)
        at org.jooq.impl.Tools.fetchOne(Tools.java:1762)
        at org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:545)
        at org.jooq.impl.SelectImpl.fetchOne(SelectImpl.java:2879)
    

    那么,有没有一个解决方案可以在 飞秒 是吗?

    1 回复  |  直到 6 年前
        1
  •  3
  •   MondKin    6 年前

    你可以避免 DayToSecond 通过从间隔差中提取秒数,并用Java将其作为一个简单的数字:

    使用此函数(部分取自 here )以下内容:

    public static Field<Integer> diff(Field<Instant> field1, Field<Instant> field2) {
        return DSL.field("extract(epoch from {0} - {1})", Integer.class, field1, field2);
    }
    

    为了改变这个:

    timestampDiff(Tables.MISSION.SOLVE_DATE, Tables.MISSION.START_DATE)
    

    进入这个:

    diff(Tables.MISSION.SOLVE_DATE, Tables.MISSION.START_DATE)
    

    然后你宣布 SPEED 作为:

    Field<Integer> SPEED = field("SPEED", Integer.class);