如何在Jooq中选择unix时间戳作为日期?

问题描述 投票:2回答:1

我正在使用一个数据库,该数据库中的日期存储为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个回答
0
投票

您在这里使用了许多特定于供应商的功能,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.*;
© www.soinside.com 2019 - 2024. All rights reserved.