将查询中的时区映射到postgresql到jpql

问题描述 投票:0回答:1

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

我的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个回答
0
投票

您不应该使用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 >= x and a <= y

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

SET SESSION TIME ZONE 'Europe/Paris'
© www.soinside.com 2019 - 2024. All rights reserved.