Jooqに日付などのUNIXタイムスタンプを選択するには?

アンナアイラHurnaus:

私は日付が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に箱から出してサポートされていませんが、かなりの数のベンダー固有の機能を使用しています。あなたはこのような状況に遭遇したときにいつものように、あなたが使用して独自のサポートをロールバックすることができますプレーンなSQLのテンプレートを理想的に独自のライブラリを構築することにより、:

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.*;

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=364536&siteId=1