我试图从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
我基本上想要在它所在的时区中返回日期,在这种情况下是太平洋时区。
如果是没有时区的时间戳,则首先需要告诉它使用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
如果'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 zone
(timestamptz
)开始,然后你可以投射到date
:
SELECT '2014-01-01 02:00:00+0'::timestamptz::date;
关于Postgres的时间戳:
最近的相关答案有更多细节(也涉及索引):
我想通了,使用间隔,我可以减去偏移然后得到日期。
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');
在这里添加答案,因为我确信这个问题可能是其他人想要知道的。