在 Postgresql 中使用时区转换按时间分组
Group by time with timezone conversion in Postgresql
我正在处理当前以 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 分组,在 PST 中是 16:00。但是,我希望 groupby 从 0:00 PST 开始。我该怎么做呢?现在,每个组中每天的计数都具有误导性,因为它们是从下午 4 点到下午 4 点,而不是凌晨 12 点到凌晨 12 点。例如,周日的计数异常高,因为周日在 groupby 中包含了周一的部分数据。我将不胜感激任何解决此问题的意见。谢谢。
答案取决于它是带时区的时间戳还是不带时区的时间戳:
如果是带时区的时间戳,可以用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')
获取日期
无论哪种情况,您都必须先转换时区 ,然后再 截断到日级别,否则您可能会得到不准确的结果。
我正在处理当前以 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 分组,在 PST 中是 16:00。但是,我希望 groupby 从 0:00 PST 开始。我该怎么做呢?现在,每个组中每天的计数都具有误导性,因为它们是从下午 4 点到下午 4 点,而不是凌晨 12 点到凌晨 12 点。例如,周日的计数异常高,因为周日在 groupby 中包含了周一的部分数据。我将不胜感激任何解决此问题的意见。谢谢。
答案取决于它是带时区的时间戳还是不带时区的时间戳:
如果是带时区的时间戳,可以用
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')
获取日期
无论哪种情况,您都必须先转换时区 ,然后再 截断到日级别,否则您可能会得到不准确的结果。