简单平均算法略有偏差。为什么? Active Record / PostgreSQL问题?

时间:2013-01-05 21:54:21

标签: sql ruby-on-rails activerecord timezone

在我的Rails应用程序中,我每30分钟运行两个自定义Rake任务。 任务A 从互联网上抓取每小时价格,并将其作为HourlyPrice保存到数据库中。 任务B 进入数据库,在过去七天内每小时收取一小时的价格,并将它们平均为在单独的数据库表中创建新的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的时区目前设置为'Mountain Time(美国和加拿大)'。这是价格交换所在的地方。我没有调整我的PostgreSQL DB的时区,我相信它默认为UTC。当运行任务B时,我注意到它是UTC时间下午9:20,在UTC日剩下三个小时,这可能解释了七天中最后一天只有三个每小时价格的平均值。我将在接下来的一小时内再次尝试运行任务B,看看它是否平均只有两个小时。更新到来......这个时区冲突是否会导致问题,或者我正在做什么,因为我有自己的日期列,所以我不会对时区进行隔离?
  3. 更新 - 发现问题,但如何修复? 线索#2是正确的。这是一个时区问题。我刚刚再次运行任务B(一小时后,还剩2小时,直到UTC日更改),现在只有七天的最后一天平均两个HourlyPrices。

    如果有24个HourlyPrice记录可用,我如何才能将上面的查询修正为平均值?

0 个答案:

没有答案