时区感知date_trunc函数

时间:2014-06-04 14:22:07

标签: postgresql timezone timezone-offset

以下查询

SELECT the_date FROM date_trunc('day', timestamp with time zone 
       '2001-01-1 00:00:00+0100') as the_date

结果

the_date
2000-12-31 00:00

有没有办法告诉date_trunc根据它所用的时区进行日/月/年转换?

预期输出为:2001-01-1 00:00+0100

3 个答案:

答案 0 :(得分:15)

您需要指定您希望它显示的时区

select
    date_trunc(
        'day',
        timestamp with time zone '2001-01-1 00:00:00+0100' at time zone '-02'
    ) as the_date;
      the_date       
---------------------
 2001-01-01 00:00:00

AT TIME ZONE

答案 1 :(得分:2)

虽然对于OP的奇怪情况,标记的答案可能是正确的,但对其他人来说更可能是不正确的。您需要将date_trunc返回的时间戳转换为适当的时区。

select
    date_trunc(
        'day',
        some_timestamp at time zone users_timezone
    ) at time zone users_timezone as the_date;

要理解的重要一点是,date_trunc会返回一个timestamp,但没有附加时区。您需要将时间戳转换为适当的时区,因为数据库客户端或下游的任何时区可能具有不同的时区。

答案 2 :(得分:0)

@Adam的回答肯定会更有帮助。尽管我认为我们可以再次改进它,因为如果将时间戳缩短到一天(或一周/一个月/等等),那么我们要确保我们正在处理的是Date对象,而不是Timestamp。否则,我们可能会给其他代码段以印象,就是实际上是在午夜(或一天中可能有其他误导性的时间)发生了某事。

所以我会用:

SELECT date_trunc('day', some_timestamp AT TIME ZONE users_timezone)::date AS the_date;

将结果强制转换为日期,而不是时间戳。

结果将类似于:

  the_date
------------
 2019-09-14

而不是以下的更具误导性的结果

      the_date
---------------------
 2019-09-14 00:00:00