我想将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中的时区无效。
答案 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'