时区感知postgres查询创建分钟,小时,天的时间序列

时间:2016-03-16 13:49:58

标签: ruby-on-rails postgresql postgresql-9.4

我很难弄清楚如何处理以下问题:

我们公司正在向社交媒体平台发布帖子。一旦成功发布,这些帖子就存储在数据库中。

我们希望提供一个信息中心,其中显示用户在一段时间内按分钟,小时和天分组的帖子数量的概述。

我想将结果显示为时间序列图。

这样可以正常工作,但是当我按天进行聚合/分组时,一旦我必须支持多个时区,它就变得非常棘手。 (显然午夜左右的帖子属于不同的日期,具体取决于你所在的时区)

我当前的解决方案使用rails ActiveRecord构建postgres查询。我面临的问题是我正在努力应对时区转换...... 我也不擅长postgres ...... 当前的实现基本上看起来像这样(我删除了不相关的代码):

Publication.select(                                                                                                                                                         
    %{date_trunc('#{interval}',
      published_at::timestamptz at time zone interval '#{time_zone_offset}')::timestamptz as time,
      count(published_at)})
      .where(%(published_at BETWEEN
          timestamptz '#{start_date}' AND
          timestamptz '#{end_date}'))
          .group("1")
          .order('time').limit(LIMIT)

例如:

我在2016-03-15 10:19:24.219258有一个出版物(这就是它如何存储在数据库中因此UTC时间) 我创建了以下查询:

SELECT  date_trunc('hour',
      published_at::timestamptz at time zone interval '+01:00')::timestamptz as time,
      count(published_at) FROM "publications" WHERE (published_at BETWEEN
          timestamptz '2016-03-15 10:00:00 +0100' AND
          timestamptz '2016-03-15 12:00:00 +0100') GROUP BY 1 
;

结果是:

          time          | count 
------------------------+-------
 2016-03-15 10:00:00+01 |     1
(1 row)

应该是:

时间:" 2016-03-15 10:00:00 UTC"或" 2016-03-15 11:00:00 + 01" (我不关心时区表示,但这只是错误的结果)

有谁知道我在做错了什么?

我遇到的主要问题是,我希望能够根据请求查询的用户的时区,每天对发布进行分组/聚合。 我不关心返回哪个时区,因为前端可以将其转换为用户时区。

非常感谢任何反馈,帮助或回答。 非常感谢

1 个答案:

答案 0 :(得分:0)

感谢我与devanand进行的讨论,一个解决方案是拆分代码并使用问题中使用的查询处理每日间隔。

对于其他区间,我使用以下查询:

    Publication.select(
      %{date_trunc('#{interval}',
      published_at::timestamptz) as time,
      count(published_at)})
               .where(%(published_at BETWEEN
          timestamptz '#{start_date}' AND
          timestamptz '#{end_date}'))
               .group('1')
               .order('time').limit(LIMIT)

我对解决方案不满意,因为它对我来说更像是一种解决方法