簡體   English   中英

Rails / Postgresql:如何在特定時區按日期使用日期時間字段快速分組記錄?

[英]Rails / Postgresql: How can I quickly group records using a datetime field by date in a specific time zone?

我在Ruby on Rails上使用postgresql。 現在我用它來計算每天注冊的用戶數量:

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

這有效,但用戶根據UTC分組。 如何根據EST對用戶進行分組?

更新

用戶根據UTC分組。 如何根據EST對用戶進行分組?

澄清:以UTC開始和結束的特定日期與EST開始和結束的同一日期不同。 現在,上述命令生成的查詢將創建用戶的日期時間視為UTC,並根據該時間跨度對用戶進行分組。 考慮到我想根據EST而不是UTC按日期分組,我該如何彌補這一點?

我嘗試了以下(感謝Erwin 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/02/2011在EST(UTC - 5小時)。 我很感激任何幫助。

在轉換為日期之前,您可以使用表達式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”的含義是什么。 但無論如何,你可以用這種結構實現它。

我參加派對有點晚了,但是因為我自己剛遇到這個問題,我想我會發布一些似乎在我的情況下工作的東西。 我正在修改數據庫中的日期字段,方法是根據配置的rails時區添加/減去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")

不是很漂亮,但似乎完成了工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM