Как собрать из поля «метка времени без часового пояса» в метку времени Java без часового пояса - PullRequest
1 голос
/ 24 февраля 2020

Мой запрос Jooq:

dslContext.select(
                timeInterval,
                ifnull(avg(field(FieldName.AVERAGE, Double.class))
                        .cast(Double.class), 0.0))
                .from(channelTimebucketQuery)
                .groupBy(timeInterval)
                .orderBy(timeInterval)
                .collect(Collectors.toMap(Record2::component1, Record2::component2));

возвращает метку времени с привязанным к ней часовым поясом и двойное значение enter image description here

Но мой профилировщик говорит, что он должен вернуться метка времени без часового пояса.

select pg_typeof(time_bucket) from (

    select "alias_67258973"."time_bucket", coalesce(cast(avg(average) as double precision), 0.0) from (select "public"."time_bucket_gapfill"("bucket_width" := cast("public"."create_interval"("seconds" := 43200) as "pg_catalog"."interval"), "ts" := cast("public"."testTable"."time" as timestamp), "start" := cast(null as timestamp), "finish" := cast(null as timestamp)) as "time_bucket", avg("public"."testTable"."average") as "average" from "testTable" where ("public"."testTable"."device" in ('702088'  ) and "public"."testTable"."time" >= timestamp '2020-02-10 13:57:28.2212375' and "public"."testTable"."time" <= timestamp '2020-02-24 13:57:28.2222399') group by time_bucket) as "alias_67258973" group by "alias_67258973"."time_bucket" order by "alias_67258973"."time_bucket"
        ) as x;

enter image description here

Откуда берется часовой пояс? Как мне получить часовой пояс до + 0000

1 Ответ

1 голос
/ 25 февраля 2020

Тип JDB C по умолчанию для типа SQL TIMESTAMP WITHOUT TIME ZONE (или просто TIMESTAMP) равен java.sql.Timestamp. По историческим причинам, о которых мы все сожалеем, java.sql.Timestamp расширяет java.util.Date, который моделирует TIMESTAMP WITHOUT TIME ZONE, связывая ваш JVM часовой пояс (то есть TimeZone.getDefault()) с unix отметкой времени.

Гораздо лучшим представлением типа данных SQL TIMESTAMP WITHOUT TIME ZONE является java.time.LocalDateTime, который также поддерживает jOOQ. Более поздние версии генератора кода jOOQ установят <javaTimeTypes>true</javaTimeTypes>, чтобы сделать типы JSR-310 значениями по умолчанию.

Тем не менее, несмотря на путаницу от отладчика и связанный неявный часовой пояс в java.sql.Timestamp, два типы данных эквивалентны друг другу и могут быть преобразованы друг в друга с помощью:

...