【问题标题】:How to select unix timestamp as date in Jooq?如何在 Jooq 中选择 unix 时间戳作为日期?
【发布时间】:2020-07-06 00:02:27
【问题描述】:

我正在使用一个数据库,其中日期存储为 unix 时间(自 1970 年以来的秒数)。我有以下按预期工作的 sql:

select CONVERT_TZ(FROM_UNIXTIME(creation_date), @@session.time_zone, "Europe/Berlin")
from transaction; 

这就是我在 Jooq 中尝试这样做的方式:

dsl.select(DSL.date(TRANSACTION.CREATION_DATE) // This does not work
   .from(TRANSACTION)
   .fetch();

【问题讨论】:

    标签: java mysql orm unix-timestamp jooq


    【解决方案1】:

    您在那里使用了很多供应商特定的功能,这些功能在 jOOQ 中不受支持。与往常一样,当您遇到这种情况时,您可以使用 plain SQL templating 提供自己的支持,最好是构建自己的库:

    public static Field<Timestamp> fromUnixtime(Field<? extends Number> field) {
        return field("from_unixtime({0})", SQLDataType.TIMESTAMP, field);
    }
    
    public static Field<Timestamp> convertTz(
        Field<Timestamp> field,
        Field<String> fromTz,
        Field<String> toTz
    ) {
        return field("convert_tz({0}, {1}, {2})", SQLDataType.TIMESTAMP, field, fromTz, toTz);
    }
    
    public static Field<String> sessionTimeZone() {
        return field("@@session.time_zone", SQLDataType.VARCHAR);
    }
    

    现在,你可以这样使用它:

    dsl.select(convertTz(
            fromUnixtime(TRANSACTION.CREATION_DATE), 
            sessionTimeZone(), 
            inline("Europe/Berlin"))
       )
       .from(TRANSACTION)
       .fetch();
    

    或者,更进一步,将所有这些表达式包装在另一个辅助函数中,比如这个:

    public static Field<Timestamp> fromUnixtimeToBerlinTZ(Field<? extends Number> field) {
        return convertTz(
            fromUnixtime(TRANSACTION.CREATION_DATE), 
            sessionTimeZone(), 
            inline("Europe/Berlin")
        );
    }
    

    所有这些示例都假设通常的静态导入:

    import static org.jooq.impl.DSL.*;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-06
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      相关资源
      最近更新 更多