在Postgresql中按时区进行时区转换

时间:2018-12-14 19:20:35

标签: sql postgresql group-by timezone postico

我正在使用当前存储在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)

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

enter image description here

1 个答案:

答案 0 :(得分:1)

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

  1. 如果这是带有时区的时间戳,则可以使用select time1 AT TIME ZONE 'US/Pacific'转换为PST,并使用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')

  3. 获取日期

在这两种情况下,您都必须先将时区转换为 ,然后再将其截断为日级,否则最终结果可能会不准确。