postgresql 时区识别date_trunc函数

zpf6vheq  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(4)|浏览(127)

以下查询

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

qpgpyjmq

qpgpyjmq1#

虽然标记的答案可能对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。您需要将时间戳转换为正确的时区,因为数据库客户端或任何下游可能具有不同的时区。

but5z9lq

but5z9lq2#

您需要指定要显示的时区

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

字符串
第一个月

wgxvkvu9

wgxvkvu93#

@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

o8x7eapl

o8x7eapl4#

对于处理Date对象,而不是Timestamp,@stwr667的回答对我不起作用。
所以我用途:

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

字符串
其结果是:

the_date  
----------
2001-01-01


x1c 0d1x的数据

相关问题