获取时区偏移的日期

Wal*_*ile 8 postgresql timezone timestamp date

我试图从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';
Run Code Online (Sandbox Code Playgroud)

回报

2014-01-01 02:00:00-08
Run Code Online (Sandbox Code Playgroud)

-

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

回报

2014-01-01
Run Code Online (Sandbox Code Playgroud)

但是我希望它能够回归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';
Run Code Online (Sandbox Code Playgroud)

回报

2014-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

但是我希望它能够回归 2013-12-31 00:00:00

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

Clo*_*eto 27

如果是没有时区的时间戳,则首先需要告诉它使用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
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 6

如果'America/Los_Angeles'是您当前的时区(timezone当前会话的设置),那么只需告诉 Postgres timestamp.

SELECT ('2014-01-01 02:00:00'::timestamp AT TIME ZONE 'UTC')::date;
Run Code Online (Sandbox Code Playgroud)

转换到date基于当前时区并根据需要自动工作。

如果当前时区可以是其他时区,则需要像 @Clodoaldo 演示一样明确。

妥善解决将是存储timestamp with time zonetimestamptz)开始说起,那么你可以转换为date

SELECT '2014-01-01 02:00:00+0'::timestamptz::date;
Run Code Online (Sandbox Code Playgroud)

关于 Postgres 中的时间戳:

最近有更多细节的相关答案(也处理索引):