Как выбрать unix отметку времени в качестве даты в Jooq? - PullRequest
3 голосов
/ 25 марта 2020

Я работаю с базой данных, в которой даты хранятся как 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 Ответ

3 голосов
/ 25 марта 2020

Вы используете довольно много специфических для c функций поставщика, которые не поддерживаются "из коробки" в 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")
    );
}

Все эти примеры предполагаем обычные данные c import:

import static org.jooq.impl.DSL.*;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...