【问题标题】:Querying Unix Timestamp using JOOQ使用 JOOQ 查询 Unix 时间戳
【发布时间】:2015-11-18 19:46:02
【问题描述】:

我正在使用 MySQL 服务器,并且正在尝试使用 JOOQ API 检索时间戳。但是,我认为默认的 JOOQ 行为返回本地时区的时间,而不是 UTC(它没有使用 UNIX_TIMESTAMP()。使用 JOOQ,我的查询看起来像

db.select(USER_TABLE.REGISTERED_ON)
    .from(USER_TABLE)
    .where(USER_TABLE.EMAIL.equal(email)
    .fetchAny()

但是,我要执行的sql应该是这样的

SELECT UNIX_TIMESTAMP(schema.table.timestamp_col)
    FROM schema.table
    WHERE email="someone@domain.com"

是否可以使用 JOOQ API?如果不是,那么运行此查询的最佳方式是什么,因为我真的希望能够使用生成的代码(USER_TABLE、USER_TABLE.REGISTERED_ON 等)。

编辑:我现在正在执行以下操作,但它安全吗?基本上我正在从 JOOQ 生成的类中删除引用。

String timestamp_field = USER_TABLE.REGISTERED_ON.toString().replace("\"", "");
Field<?> f = DSL.field("UNIX_TIMESTAMP(" + timestamp_field + ")");
Record r = db.select(f)
    .from(USER_TABLE)
    .where(USER_TABLE.EMAIL.equal(email))
    .fetchAny();                

【问题讨论】:

    标签: mysql unix timestamp jooq


    【解决方案1】:

    有几种方法可以解决这个问题:

    使用ConverterBinding 转换类型

    您可以在源代码生成器中注册数据类型ConverterBinding。这样,代码生成器将为数据库中的每个TIMESTAMP 字段生成一个Field&lt;YourType&gt;。可能有用的类型是:

    • java.lang.Long
    • java.time.Instant
    • java.time.OffsetDateTime(请注意,jOOQ 3.7 将通过 [#4338] 支持此功能)3

    使用普通 SQL

    每次您想使用UNIX_TIMESTAMP() 函数进行显式转换时,请使用plain SQL。您的解决方案有效:

    String timestamp_field = USER_TABLE.REGISTERED_ON.toString().replace("\"", "");
    Field<?> f = DSL.field("UNIX_TIMESTAMP(" + timestamp_field + ")");
    

    但不建议这样做,因为:

    • 您应该永远依赖于任何 Java 类型的任何 toString() 实现。
    • 您通常应该尽量避免使用 jOOQ 的普通 SQL API 进行字符串连接

    更好的解决方案是:

    DSL.field("UNIX_TIMESTAMP({0})", Long.class, USER_TABLE.REGISTERED_ON);
    

    甚至:

    public static Field<Long> unixTimestamp(Field<Timestamp> arg) {
        return DSL.field("UNIX_TIMESTAMP({0})", Long.class, arg);
    }
    

    在数据库中使用BIGINT

    您当然可以在数据库中使用BIGINTBIGINT UNSIGNED 而不是TIMESTAMP。这样,您将始终自动获得整数 unix 时间戳值。为了完整起见,这只是一种解决方法。

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 2020-07-06
      相关资源
      最近更新 更多