【问题标题】:Map timezone in query from postgresql to jpql将查询中的时区从 postgresql 映射到 jpql
【发布时间】:2019-08-31 14:36:03
【问题描述】:

我想将我的 postgresql 查询映射到 java 中的 jpql 查询。而且我无法映射“创建的 AT 时区 'UTC' AT 时区 'Europe/Paris'”。

我的 postgresql 查询:

SELECT count(*), to_char(created AT time zone 'UTC' AT time zone 'Europe/Paris','DD-MM-YYYY') 
from my_table GROUP BY to_char(created AT time zone 'UTC' AT time zone 'Europe/Paris','DD-MM-YYYY');

我的 jpql 查询:

Query query = em.createQuery("select count(z), to_char(z.created, 'DD-MM-YYYY'), z.formType from MyTableEntity z where z.created >= :startFrom and z.created <= :endTo GROUP BY to_char(z.created, 'DD-MM-YYYY'), z.formType ");

如何按我在时间戳“欧洲/巴黎”中创建的字段进行分组?在数据库中创建的字段保存在时间戳中。 jpql 中的 AT 时区不起作用。

【问题讨论】:

    标签: java postgresql jpql


    【解决方案1】:

    您根本不应该使用to_char 将日期转换为字符串。让 JPA 处理转换。 PostgreSQL 也可以存储时间戳,但它不存储时区。它只存储给定时刻的时区偏移量。

    按日期获取这些结果的方法是强制转换为日期,而不是使用格式。以下是它作为本机查询的外观:

    SELECT count(*), cast(created AS date), form_type from my_table
    GROUP BY cast(created AS date), form_type;
    

    在 JPQL 中:

    SELECT count(z), cast(z.created as date), z.formType from MyTableEntity z
    where z.created between :startFrom and :endTo
    GROUP BY cast(z.created as date), z.formType
    

    a between x and y 语句等价于a &gt;= x and a &lt;= y

    如果您的数据库在默认时区为Europe/Paris 的服务器上运行,则您不需要进行时区转换。或者,您可以运行本机查询来设置当前连接 https://www.postgresql.org/docs/9.1/sql-set.html 的时区,然后运行其他查询。

    SET SESSION TIME ZONE 'Europe/Paris'
    

    【讨论】:

    • 好的,谢谢。我明白了,没有任何与“在时区”等效的功能吗?
    • 这是 JPQL 缺乏的众多功能之一。在时区方面,最受欢迎的数据库包括 MySQL 和 MariaDB。
    • 好的,谢谢。所以,我必须使用我的sql。除非我可以在例如标准 API 中做到这一点?我尽量避免使用 sql。项目应该可以扩展到其他数据库。
    • 在这种情况下,最好确保您的设置始终使用 UTC,并且尽可能不依赖时区信息。我意识到这并不总是可能的,因为我有一个项目无法避免跨时区数据,因为当您必须保持在一个 TZ 出发和另一个 TZ 到达的时间表时。
    • 是的,我总是尝试在 UTC 中保持日期,但在这种情况下,我想做一些统计数据(在我的时区中创建了多少实体)。这就是我想更改时区的原因:)
    猜你喜欢
    • 2014-06-18
    • 2012-08-18
    • 2019-03-01
    • 2015-06-01
    • 2019-04-02
    • 1970-01-01
    • 2017-07-18
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多