2011-12-01 3 views
5

Ruby on Railsでpostgresqlを使用しています。今、私は毎日の上にサインアップしたユーザーの数をカウントするためにこれを使用しています:Rails/Postgresql:特定のタイムゾーンで日時フィールドを使ってレコードを素早くグループ化する方法はありますか?

@users_signup_by_day = User.count(:order => 'DATE(created_at) DESC', :group => ["DATE(created_at)"]) 

これは動作しますが、ユーザーがUTCに応じてグループ化されています。どのようにしてESTに従ってユーザーをグループ化できますか?

更新

ユーザーがUTCに応じてグループ化されています。 ESTに基づいてユーザーをグループ化するにはどうすればよいですか?

明確にする:UTCで始まり、UTCで終了する特定の日付は、ESTで開始され、終了する日付とは異なる時間です。現在、上記のコマンドによって生成されたクエリは、ユーザーが作成した日時をUTCにして、その期間に基づいて作成された日までにユーザーをグループ化します。 UTCではなくESTに基づいて日付別にグループ化したいと考えて、これをどのように補うことができますか?

私は、次の(おかげアーウィンBrandstetter)を試してみました:

User.count(:order => "DATE(created_at AT TIME ZONE 'EST') DESC", :group => ["DATE(created_at AT TIME ZONE 'EST')"]) 

をしかし、最初の結果が

["2011-12-02", 276] 

であり、それは12月2日ではないので、これは正しい結果が得られていません/ 2011年(UTC - 5時間)はまだです。私はどんな助けにも感謝しています。

答えて

6

キャストする前に式timestamp_column AT TIME ZONE 'EST'を使用できます。このデモを考えてみましょう:

SELECT t AS ts_utc 
     ,t::date AS date_utc 
     ,t AT TIME ZONE 'EST' AS ts_est 
     ,(t AT TIME ZONE 'EST')::date AS date_est 
FROM (
    VALUES 
    ('2011-12-1 03:00'::timestamp) -- defaults to timestamp without time zone 
    ,('2011-12-2 12:00') 
    ,('2011-12-3 23:00')) t(t); 

結果:

 ts_utc  | date_utc |   ts_est   | date_est 
---------------------+------------+------------------------+------------ 
2011-12-01 03:00:00 | 2011-12-01 | 2011-12-01 09:00:00+01 | 2011-12-01 
2011-12-02 12:00:00 | 2011-12-02 | 2011-12-02 18:00:00+01 | 2011-12-02 
2011-12-03 23:00:00 | 2011-12-03 | 2011-12-04 05:00:00+01 | 2011-12-04 

ts_estを自動的に表示するために、あなたの現在の場所のタイムゾーンに変換された時間帯、でリテラル与えられた時間を構成し、「01」私の場合、私のデータベースサーバはオーストリアのウィーンにあり、ロケール設定が一致しています。

「ESTに準拠した」ということは、あなたの質問から完全にはっきりとは分かりません。しかし、どちらか一方の方法で、あなたはその構造でそれを達成することができます。

1

私はパーティーに少し遅れましたが、私はこの問題に直面して以来、自分の状況で働いているようなものを投稿すると思っていました。私は、設定されたレールのタイムゾーンに基づいてUTCオフセットを追加/減算することによってデータベースの日付フィールドを変更しています。したがって、たとえば:

offset = Time.zone.formatted_offset 
interval = "#{offset[0]} time '#{offset[1..-1]}'" 

@users_by_day = User.group("date(created_at #{interval})").select("count(id) as counter, date(created_at #{interval}) as created") 

非常にきれいではありませんが、仕事を完了したようです。

関連する問題