具有原始时间戳的时区的date_trunc

时间:2019-11-20 20:31:00

标签: postgresql

我有一个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

有人可以帮我吗?

1 个答案:

答案 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将附加我定义的时区-不会省略。