[英]Rails: How to group records that have the same Date (month day year) for a Datetime field?
[英]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.