获取时区偏移的日期

时间:2014-04-10 19:11:12

标签: postgresql date timestamp timezone

我正在尝试从postgres中的查询中提取日期。时间戳存储为UTC,所以如果我有1/1/2014 02:00:00,我希望太平洋时间的日期是12/31/2013,而不是2014年1月1日。我非常接近,但查询2和3仍然会返回2014年1月1日。

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles';

返回

2014-01-01 02:00:00-08

-

SELECT CAST('1-1-2014 02:00:00'::timestamp at time zone 'America/Los_Angeles' AS Date);

返回

2014-01-01

但我希望它返回2013-12-31

SELECT CAST('1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles' AS Date) at time zone 'America/Los_Angeles';

返回

2014-01-01 00:00:00

但我希望它返回2013-12-31 00:00:00

我基本上想要在它所在的时区中返回日期,在这种情况下是太平洋时区。

3 个答案:

答案 0 :(得分:24)

如果是没有时区的时间戳,您需要先告诉它使用UTC时区然后转换为另一个时区:

SELECT '1-1-2014 02:00:00'::timestamp at time zone 'UTC' at time zone 'America/Los_Angeles';
      timezone       
---------------------
 2013-12-31 18:00:00

答案 1 :(得分:3)

如果'America/Los_Angeles'是您当前时区的当前时区(timezone设置),那么请告诉Postgres timestamp的时区。

SELECT ('2014-01-01 02:00:00'::timestamp AT TIME ZONE 'UTC')::date;

转化为date基于当前时区,并根据需要自动生效。

如果当前时区可能是其他时区,则需要明确like @Clodoaldo demonstrates

正确的解决方案将存储timestamp with time zonetimestamptz)开始,然后您可以转换为date

SELECT '2014-01-01 02:00:00+0'::timestamptz::date;

关于Postgres的时间戳:

最近的相关答案以及更多细节(也涉及索引):

答案 2 :(得分:0)

我弄清楚了,使用间隔,我可以减去偏移量然后得到日期。

SELECT '1-1-2014 02:00:00'::timestamp + INTERVAL '1 hour' * extract(timezone_hour FROM '1-1-2014 00:02:00'::timestamp at time zone 'America/Los_Angeles');

在这里添加答案,因为我确信这个问题可能是其他人想要知道的。