Estoy trabajando con una base de datos en la que las fechas se almacenan como tiempo Unix (segundo desde 1970). Tengo el siguiente código SQL que funciona como se esperaba:
select CONVERT_TZ(FROM_UNIXTIME(creation_date), @@session.time_zone, "Europe/Berlin")
from transaction;
Así es como he tratado de hacerlo en Jooq:
dsl.select(DSL.date(TRANSACTION.CREATION_DATE) // This does not work
.from(TRANSACTION)
.fetch();
Usted está utilizando un buen número de funciones específicas del proveedor allí, que no son compatibles fuera de la caja en jOOQ. Como siempre, cuando se encuentra con esta situación, se puede rodar su propio apoyo mediante el uso de plantillas de SQL normal , idealmente mediante la construcción de su propia biblioteca:
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);
}
Ahora, se puede utilizar de esta manera:
dsl.select(convertTz(
fromUnixtime(TRANSACTION.CREATION_DATE),
sessionTimeZone(),
inline("Europe/Berlin"))
)
.from(TRANSACTION)
.fetch();
O bien, tomar un paso más allá y envolver todas estas expresiones en otra función auxiliar, como éste:
public static Field<Timestamp> fromUnixtimeToBerlinTZ(Field<? extends Number> field) {
return convertTz(
fromUnixtime(TRANSACTION.CREATION_DATE),
sessionTimeZone(),
inline("Europe/Berlin")
);
}
Todos estos ejemplos están asumiendo la importación estática habitual:
import static org.jooq.impl.DSL.*;