3

我正在处理当前存储在 UTC 中的时间数据,但我希望它在 PST 中,比它晚了 8 小时。我有一个相当冗长和复杂的查询,但我唯一感兴趣的是现在的时间,所以我已经包括了这些部分。我想将时间转换为 PST,然后按数据最后一周的日期分组。查询具有以下结构:

select
 date_trunc('day', time1) AT TIME ZONE 'US/Pacific'
 ...
where 
 time1 AT TIME ZONE 'US/Pacific' > now() AT TIME ZONE current_setting('TimeZone') -  INTERVAL '168 HOURS'
 ...
group by date_trunc('day', time1)

这导致以下时间分组。据我了解,它从 0:00 UTC 分组,即太平洋标准时间 16:00。但是,我希望 groupby 在太平洋标准时间 0:00 开始。我该怎么做呢?现在,每组中的计数对于每天都有误导性,因为它们是从下午 4 点到下午 4 点,而不是从上午 12 点到上午 12 点。例如,星期日的计数异常高,因为星期日在 groupby 中包含星期一的部分数据。对于解决此问题的任何意见,我将不胜感激。谢谢你。

在此处输入图像描述

4

1 回答 1

8

答案取决于它是带时区的时间戳还是不带时区的时间戳:

  1. 如果它是带时区的时间戳,您可以转换为 PSTselect time1 AT TIME ZONE 'US/Pacific'并获取日期select date_trunc('day', time1 AT TIME ZONE 'US/Pacific')

  2. 如果它是一个没有存储在 UTC 中的时区的时间戳要转换,你首先必须告诉 PostgreSQL 将其解释为 UTC,然后转换它,如下所示:select (time1 AT TIME ZONE 'Z') AT TIME ZONE 'US/Pacific'当然你可以用select date_trunc('day', (time1 AT TIME ZONE 'Z') AT TIME ZONE 'US/Pacific')

在任何一种情况下,您都必须在截断到日级别之前转换时区,否则您最终可能会得到不准确的结果。

于 2018-12-15T05:32:45.703 回答