我有一个服务器,它为我提供了一些按天分组的信息,所以我尝试使用date_trunc()
,但由于时区的原因,我知道数据库中的2020-06-05 21:00:00
实际上是2020-06-06 00:00:00
。
所以如果我只使用date_trunc
,我得到了2020-06-05 00:00:00
,但我需要2020-06-06 00:00:00
。
我正在尝试这个:
select tm , date_trunc('day', (tm) at time zone '+3')
from scm.tbl
where (tm BETWEEN '2020-06-05 15:00:00+00:00:00' AND '2020-06-08 20:59:00+00:00:00')
order by tm
我有这个:
2020-06-05 17:59:59 | 2020-06-05 00:00:00
2020-06-05 18:00:10 | 2020-06-06 00:00:00
在18:00,日期变成了2020-06-06,但不应该。为什么呢?我在这里做错了什么?
问题是AT TIME ZONE
会将timestamp without time zone
转换为timestamp with time zone
,并且再次根据您当前的timezone
设置进行处理。
因此,您需要使用两次AT TIME ZONE
,首先解释正确时区的时间戳,然后提取 UTC 时钟当时将显示的内容:
SELECT tm, date_trunc('day', tm AT TIME ZONE '+3' AT TIME ZONE 'UTC')
FROM scm.tbl
WHERE (tm BETWEEN '2020-06-05 15:00:00+00:00:00' AND '2020-06-08 20:59:00+00:00:00')
ORDER BY tm;
我在这里找到了答案 时区感知date_trunc函数
当我在答案中看到这个时:
timestamp with time zone '2001-01-1 00:00:00+0100' at time zone '-02'
这是因为 tm 是 +03:00:00,我再次添加它......
所以我能做的是:
date_trunc('day', tm at time zone '0')
我想一定有更好的方法来做到这一点,没有"0">