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)
如果'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 zone(timestamptz)开始说起,那么你可以转换为date:
SELECT '2014-01-01 02:00:00+0'::timestamptz::date;
Run Code Online (Sandbox Code Playgroud)
关于 Postgres 中的时间戳:
最近有更多细节的相关答案(也处理索引):