「スナップショット」データを保存するテーブルがあります。勤務中のスタッフの数が 10 分ごとに取得され、そこに保存されます。特定の平日 (たとえば、過去 4 日間の日曜日) の 1 日を通して勤務しているスタッフの数を示すレポートを生成したいと考えています。
Rails では、クエリは次のようになります。
<model>.where("EXTRACT(dow FROM (time + interval '#{time_zone_offset} hours')) = ?", Time.zone.now.wday)
.where('time BETWEEN ? AND ?', 5.weeks.ago.end_of_week, 1.week.ago.end_of_week)
.select("organisation_id, date_trunc('hour', time) as grouped_time, avg(staff) as staff")
.group("grouped_time").order("grouped_time")
これは、次の SQL に変換されます。
SELECT date_trunc('hour', time) as grouped_time, avg(staff) as staff
FROM <model>
WHERE (EXTRACT(dow FROM (time + interval '10 hours')) = 0)
AND (time BETWEEN '2013-09-22 13:59:59.999999' AND '2013-10-20 13:59:59.999999')
GROUP BY grouped_time
ORDER BY grouped_time
この場合、time_zone_offset
ルックアップを行っているユーザーによって異なります。
def time_zone_offset
@tzoffset ||= ActiveSupport::TimeZone[current_user.organisation.time_zone].utc_offset / 60 / 60
end
(現在のタイム ゾーンも around_filter に設定されているため、これら1.week.ago
は正しいゾーンに含まれます。)
私のデータベースのタイムゾーンは UTC ( set TIME ZONE 'UTC'
) です。
これは機能しますが、手動で操作するよりも、特定の曜日のレコードを検索するためのより良い方法があると確信していますinterval
。また、それが適用されるタイムゾーンの DST では機能しないと思います。PostgreSQL がを特定のタイム ゾーンに変換time with time zone
できることは知っていますが、これには日付が含まれていないため、曜日がわかりません。私が試した他のWHERE句:
EXTRACT (dow from time') = 0
- これにより、日曜日の午前 10 時から月曜日の午前 10 時までのスナップショットが得られますEXTRACT (dow from time at time zone 'Brisbane/Australia') = 0
- これにより、日曜日の午後 8 時から月曜日の午後 8 時までのアクションが可能になります。私の理解では、これは、Postgres がフィールドをUTC からブリスベン時間に変換するtime
のではなく、ブリスベン時間であるかのように扱うために発生するということです。
したがって、このクエリを機能させるために何かすべきことがあるかどうか知りたいです。