我正在使用当前存储在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中包含周一数据的一部分。对于解决此问题的任何投入,我们将不胜感激。谢谢。
答案 0 :(得分:1)
答案取决于是带时区的时间戳还是不带时区的时间戳:
如果这是带有时区的时间戳,则可以使用select time1 AT TIME ZONE 'US/Pacific'
转换为PST,并使用select date_trunc('day', time1 AT TIME ZONE 'US/Pacific')
来获取日期
如果它是您要转换的没有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')
在这两种情况下,您都必须先将时区转换为 ,然后再将其截断为日级,否则最终结果可能会不准确。