我读过Extract date part from timestamptz,但这并没有回答这个问题。
我有timestamp with time zone
列。并不是所有的值都存储在同一个时区(尽管我知道,postgres实际上是用UTC存储的)。
我想提取日期,**在本地时区。**不是转换到数据库的默认时区后的日期,也不是转换到我的会话的时区后的日期。
例如,考虑2020-01-01 23:00:00-07
。下面的三个查询都返回2020-01-02
,当我想要的结果是2020-01-01
。
SET TIMEZONE TO 'UTC';
SELECT '2020-01-01 23:00:00-07'::TIMESTAMPTZ::DATE;
SELECT date('2020-01-01 23:00:00-07'::TIMESTAMPTZ);
SELECT DATE_TRUNC('day', '2020-01-01 23:00:00-07'::TIMESTAMPTZ)::DATE;
字符串
更改会话的时区以获得所需结果并不是解决方案。我正在寻找一个通用的解决方案,它应该独立于会话的时区工作,并适用于可能存储在列中的所有偏移,而不仅仅是上面的玩具示例中的偏移。
1条答案
按热度按时间wz3gfoph1#
在发布这篇文章后不久,我意识到我是多么的困惑。正如Adrian的评论所说,时区并没有真正存储。如果我这么做我会注意到的
字符串
所以我的问题的简短回答是,这是不可能的(除非你自己单独存储这些信息)。
而不是删除这个问题,我会留下它的情况下,任何其他失去和困惑的灵魂有同样的问题,我会链接到这篇优秀的文章,其中解释了更详细的https://phili.pe/posts/timestamps-and-time-zones-in-postgresql/