1

在我的 Rails 应用程序中,我每 30 分钟运行两个自定义 Rake 任务。 任务 A从 Internet 上抓取每小时价格并将其作为 HourlyPrice 保存到数据库中。 任务 B进入数据库,从过去 7 天的每一天获取每小时价格,并将它们平均以在单独的数据库表中创建新的 DailyAveragePrice 记录。

但是,在运行任务 B 时,最后一天的(七个)平均价格不正确。

在 Excel 电子表格中摆弄了当天的每小时价格后,我看到任务 B 生成的平均价格是仅用最后三个小时取平均值的结果。

任务 B 主要通过这个单一查询完成:

averages = HourlyPrice.where('date >= ?', 7.days.ago).average(:price, :group => "DATE_TRUNC('day', date - INTERVAL '1 hour')")

我不明白为什么会这样?

线索

  1. HourlyPrice 有两个属性(日期时间、价格)。每个 HourlyPrice 实际上代表前一小时的价格。因此,源数据列出了 PostgreSQL 不想按原样导入日期时间列的每天 24:00:00 的价格。相反,它将所有 24:00:00 的价格转换为第二天的 00:00:00。为了弥补这一点,我尝试减去一个小时的间隔,正如您在查询中看到的那样。这是造成问题的原因吗?
  2. 我的 ActiveRecord 的时区当前设置为“山地时间(美国和加拿大)”。那是价格交易所所在的地方。我没有调整我的 PostgreSQL 数据库的时区,我相信它默认为 UTC。运行任务 B 时,我注意到现在是 UTC 时间晚上 9:20,UTC 天还剩 3 个小时,这可能解释了 7 天最后一天只有三个 HourlyPrice 的平均值。我会在接下来的一个小时内再次尝试运行任务 B,看看它是否平均只有两个小时。即将更新...这个时区冲突是否会导致问题,或者我正在做的事情是否与时区隔离,因为我有自己的日期列?

更新 - 发现问题,但如何解决? 线索 #2 是正确的。这是一个时区问题。我刚刚再次运行任务 B(一小时后,距离 UTC 日期更改还剩 2 小时),现在在 7 天的最后一天平均只有两个 HourlyPrice。

仅当有 24 HourlyPrice 记录可用时,我如何才能将上面的查询修复为平均?

4

0 回答 0