如何在 Jooq 中 select unix 时间戳作为日期?
How to select unix timestamp as date in Jooq?
我正在使用一个数据库,其中日期存储为 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();
您在那里使用了相当多的供应商特定功能,这些功能在 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.*;
我正在使用一个数据库,其中日期存储为 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();
您在那里使用了相当多的供应商特定功能,这些功能在 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.*;