将查询中的时区从Postgresql映射到jpql

时间:2019-04-10 07:51:48

标签: java postgresql jpql

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

我的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中的时区无效。

1 个答案:

答案 0 :(得分: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'