首页 > 解决方案 > 关于时区的 PostgreSQL 提取函数

问题描述

我使用 PostgreSQLextract函数来提取月份、季度、年份,如下所示:

select extract (month from adate) from atable

adate是一个timestamp with time zone

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

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

标签: postgresqltimezoneextractsql-timestamp

解决方案


基本上你所做的是使用AT TIME ZONE运算符将​​其转换TIMESTAMP WITH TIMEZONE为 aTIMESTAMP WITHOUT TIMEZONE然后将 date_part (AKA 提取)操作应用于该

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

  select extract(month from adate AT TIME ZONE 'CST' ) from atable;

如果您想要一个特定的位置:这将遵循过去日期的历史夏令时规则(和其他法定时区更改),并假定未来日期的当前规则。

  select extract(month from adate AT TIME ZONE 'America/Detroit' ) from atable;

也许使用过的定义函数将有助于休眠。

 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)';

上面的 date_part 是“提取”背后的功能之一。


推荐阅读