我很难弄清楚如何处理以下问题:
我们公司正在向社交媒体平台发布帖子。一旦成功发布,这些帖子就存储在数据库中。
我们希望提供一个信息中心,其中显示用户在一段时间内按分钟,小时和天分组的帖子数量的概述。
我想将结果显示为时间序列图。
这样可以正常工作,但是当我按天进行聚合/分组时,一旦我必须支持多个时区,它就变得非常棘手。 (显然午夜左右的帖子属于不同的日期,具体取决于你所在的时区)
我当前的解决方案使用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" (我不关心时区表示,但这只是错误的结果)
有谁知道我在做错了什么?
我遇到的主要问题是,我希望能够根据请求查询的用户的时区,每天对发布进行分组/聚合。 我不关心返回哪个时区,因为前端可以将其转换为用户时区。
非常感谢任何反馈,帮助或回答。 非常感谢
答案 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)
我对解决方案不满意,因为它对我来说更像是一种解决方法