关于时区的PostgreSQL提取函数

关于时区的PostgreSQL提取函数,postgresql,timezone,extract,sql-timestamp,Postgresql,Timezone,Extract,Sql Timestamp,我使用PostgreSQLextract函数提取月、季、年,如下所示: select extract (month from adate) from atable adate是带有时区的时间戳 我的问题是,我发现这个函数与时区完全矛盾,我正在处理一个数据库,其中的数据随时区而变化。所以在某些情况下,我需要关于太平洋时区的结果,在其他情况下,我需要关于EST或CST的结果,等等 是否有办法获取特定时区的日期月份/季度/年份 基本上,您要做的是使用AT TIME ZONE操作符将时间戳与时区一起转

我使用PostgreSQL
extract
函数提取月、季、年,如下所示:

select extract (month from adate) from atable
adate
是带有时区的
时间戳

我的问题是,我发现这个函数与时区完全矛盾,我正在处理一个数据库,其中的数据随时区而变化。所以在某些情况下,我需要关于太平洋时区的结果,在其他情况下,我需要关于EST或CST的结果,等等


是否有办法获取特定时区的日期月份/季度/年份

基本上,您要做的是使用
AT TIME ZONE
操作符将
时间戳与时区一起转换为
不带时区的时间戳
,然后对其应用日期部分(又称提取)操作

如果您想要一个特定的时区:

  select extract(month from adate AT TIME ZONE 'CST' ) from atable;
如果需要特定位置:这将遵循过去日期的历史夏时制规则(和其他法定时区更改),并假设未来日期的当前规则

  select extract(month from adate AT TIME ZONE 'America/Detroit' ) from atable;
也许一个使用过的定义函数将有助于hibernate

 CREATE OR REPLACE FUNCTION date_part_in_zone
     ( part text, instant timestamptz, zone text) 
     returns double precision language sql as 
     'SELECT date_part(part, instant AT TIME ZONE zone)';

上面的日期部分是“提取”后面的函数之一

这就是我要找的。现在我必须弄清楚如何让hibernate让我把它放在HQL查询中。它不喜欢它。哦!如果你在最初的问题中提到hibernate,我会。。。跑一英里。对不起,我帮不了你。你的回答仍然有用,谢谢!不幸的是,hql不允许我在中插入“AT TIME ZONE..”子句。不知何故,我需要欺骗hibernate不要将其解释为hibernate调用,而只是在sql中插入该子句。也许您可以编写一个已使用的定义函数?从我看来,唯一的方法是从hibernate调用sql查询,但您不能通过HQL来实现这一点。HQL对“AT TIME ZONE”子句感到异常,您会得到一个HibernateQueryException。问题是,我有大约50个复杂的查询,需要在时区进行提取,如果要通过直接sql进行提取,那将是难以置信的。