我有一个timestamptz
,我想date_trunc
,这样可以减少工作时间:
2019-01-01T17:43-03
=> 2019-01-01T00:00-03
。
但是,由于date_trunc
删除了时区,因此我需要这样做:
date_trunc('day', '2019-01-01T17:43-03'::timestamptz) at time zone '-03'
但是,我不想对时区进行硬编码,因为查询是在许多不同的时区中以timestamptz运行的(这些输入到查询中而不存储)。因此,我希望从原始时间戳中提取时区。我试图做这样的事情,但是不起作用:
date_trunc('day', '2019-01-01T17:43-03'::timestamptz) at time zone EXTRACT(...)
相关,我正在尝试从时间戳中提取时区,但只是获得了0
。
SELECT EXTRACT(timezone FROM TIMESTAMP WITH TIME ZONE '2019-01-01T00:00+03')
0
有人可以帮我吗?
答案 0 :(得分:0)
我相信您可能对时间戳和时区在PostgreSQL中的存储方式有误解(因为您似乎希望在调用-03
时保留date_trunc
,并且您希望“提取自原始时间戳”)。根据{{3}}:
当输出带有时区值的时间戳时,总是将其从UTC转换为当前时区,并在该时区中显示为本地时间。要查看其他时区的时间,请更改时区或使用AT TIME ZONE构造(请参见第9.9.3节)。
因此,陈述“在多个不同时区具有时间戳的不同客户端”(虽然为true)都将转换为UTC进行存储,然后显示在本地时区(或您指定的时区)中以进行输出。因此,调用date_trunc()
实际上会截断UTC时间戳,如果希望在特定时区显示它,则需要添加AT TIME ZONE
子句。
更新:一个例子在这里:
edb=# select date_trunc('day', '2019-01-01T17:43-03'::timestamptz) ;
date_trunc
------------------------
2019-01-01 00:00:00+00
(1 row)
edb=# set timezone to 'US/Pacific';
SET
edb=# select date_trunc('day', '2019-01-01T17:43-03'::timestamptz) ;
date_trunc
------------------------
2019-01-01 00:00:00-08
(1 row)
如您所见,date_trunc
将附加我定义的时区-不会省略。