1

私の Rails アプリでは、30 分ごとに 2 つのカスタム Rake タスクを実行しています。 タスク Aは、インターネットから 1 時間ごとの料金を取得し、HourlyPrice としてデータベースに保存します。 タスク Bはデータベースに入り、過去 7 日間の毎日の時間料金を取得し、それらを平均して、別の DB テーブルに新しい DailyAveragePrice レコードを作成します。

ただし、タスク B を実行すると、最終日の (7 回のうちの) 平均価格は正しくありません。

Excel スプレッドシートでその日の 1 時間あたりの料金をいじってみると、タスク B が生成している平均料金は、過去 3 時間だけを取得して平均した結果であることがわかりました。

タスク B は、主に次の 1 つのクエリで完了します。

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

なぜこれが起こっているのか分かりませんか?

手がかり

  1. HourlyPrice には 2 つの属性 (datetime、price) があります。各 HourlyPrice は、実際には前の 1 時間の価格を表します。したがって、ソース データには、PostgreSQL が日時列にそのままインポートしたくない各日の 24:00:00 の価格がリストされています。代わりに、すべての 24:00:00 の価格を翌日の 00:00:00 に変換します。これを補うために、クエリでわかるように、時間間隔を差し引いてみました。これが問題の原因ですか?
  2. 現在、ActiveRecord のタイム ゾーンは「山岳時間 (米国およびカナダ)」に設定されています。それが価格交換所の場所です。PostgreSQL DB のタイムゾーンを調整していません。デフォルトで UTC になっていると思います。タスク B を実行しているときに、UTC の午後 9 時 20 分であることに気付きました。UTC 日には 3 時間残っています。次の 1 時間にもう一度タスク B を実行して、平均で 2 時間しかかからないかどうかを確認します。更新予定...このタイムゾーンの競合が問題を引き起こしていますか、それとも独自の日付列があるため、私がしていることはタイムゾーンから隔離されていますか?

更新 - 問題が特定されましたが、修正方法は? 手がかり #2 は正しいです。タイムゾーンの問題です。タスク B を再度実行したところ (1 時間後、UTC 日が変わるまであと 2 時間)、7 日間の最後の平均 HourlyPrices は 2 つしかありません。

24 個の HourlyPrice レコードが利用可能な場合、上記のクエリを平均のみに修正するにはどうすればよいですか?

4

0 に答える 0