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

Posted

技术标签:

【中文标题】如何在 Jooq 中选择 unix 时间戳作为日期?【英文标题】:How to select unix timestamp as date in Jooq? 【发布时间】: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();

【问题讨论】:

【参考方案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.*;

【讨论】:

以上是关于如何在 Jooq 中选择 unix 时间戳作为日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgres 获取时间戳作为 Unix 纪元?

Pandas:使用 Unix 纪元时间戳作为日期时间索引

Excel技巧|如何在Excel中快速的批量将unix时间戳转化为北京时间

如何使用 MySQL 存储 UNIX 时间戳

如何在 twig 中显示来自 Unix 时间戳的格式化日期?

在 VBA 中,如何以简单的方式将 UTC UNIX 时间戳转换为本地时区日期?