Jan*_*lly 3 sql postgresql timezone group-by 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)
Run Code Online (Sandbox Code Playgroud)
这导致以下时间分组。根据我的理解,它从 0:00 UTC 开始分组,即 PST 中的 16:00。但是,我希望 groupby 在太平洋标准时间 0:00 开始。我该怎么做呢?现在,每个组中的计数每天都有误导性,因为它们从下午 4 点持续到下午 4 点,而不是从上午 12 点到凌晨 12 点。例如,星期日的计数异常高,因为星期日在 groupby 中包含了星期一的部分数据。我将不胜感激任何输入来解决这个问题。谢谢你。
答案取决于它是带时区的时间戳还是不带时区的时间戳:
如果它是带时区的时间戳,则可以转换为 PST withselect time1 AT TIME ZONE 'US/Pacific'并获取日期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')
在任何一种情况下,您都必须在截断到天级别之前转换时区,否则最终可能会得到不准确的结果。
| 归档时间: |
|
| 查看次数: |
1696 次 |
| 最近记录: |