2011-12-01 25 views
5

Tôi đang sử dụng postgresql với Ruby on Rails. Hiện tại tôi đang sử dụng tính năng này để đếm số lượng người dùng đăng ký mỗi ngày:Rails/Postgresql: Làm thế nào tôi có thể nhanh chóng nhóm các bản ghi bằng cách sử dụng trường ngày giờ theo ngày trong một múi giờ cụ thể?

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

Tác phẩm này, nhưng người dùng được nhóm theo UTC. Tôi có thể nhóm người dùng theo EST như thế nào?

Cập nhật

người sử dụng được nhóm theo giờ UTC. Làm cách nào để nhóm người dùng theo EST?

Để làm rõ: Một ngày nhất định bắt đầu và kết thúc bằng UTC là khoảng thời gian khác với ngày bắt đầu và kết thúc bằng EST. Ngay bây giờ truy vấn được tạo ra bởi lệnh trên xem xét datetime mà người dùng đã được tạo thành UTC, và nhóm người dùng theo ngày chúng được tạo theo khoảng thời gian đó. Làm cách nào tôi có thể bù đắp cho điều này khi tôi muốn nhóm theo ngày theo EST và không phải là UTC?

Tôi đã thử những điều sau đây (nhờ Erwin Brandstetter):

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

Nhưng điều này không cho kết quả chính xác vì kết quả đầu tiên là

["2011-12-02", 276] 

và nó không phải là 02/12/2011 EST (UTC - 5 giờ). Tôi đánh giá cao sự giúp đỡ nào.

Trả lời

6

Bạn có thể sử dụng cụm từ timestamp_column AT TIME ZONE 'EST' trước khi truyền cho đến nay. Hãy xem xét bản demo này:

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); 

Kết quả:

 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 cấu thành thời gian nhất định theo nghĩa đen ở múi giờ đó, mà được tự động chuyển đổi sang múi giờ của vị trí hiện tại của bạn để trưng bày, '01' trong trường hợp của tôi, khi máy chủ cơ sở dữ liệu của tôi nằm ở Vienna, Áo và có cài đặt miền địa phương phù hợp.

Nó không hoàn toàn rõ ràng từ câu hỏi của bạn, ý nghĩa của "theo EST". Nhưng theo cách này hay cách khác, bạn có thể đạt được nó với cấu trúc đó.

1

Tôi hơi trễ một chút với bữa tiệc, nhưng vì tôi chỉ gặp vấn đề này nên tôi nghĩ mình sẽ đăng một thứ có vẻ như đang hoạt động trong tình huống của mình. Tôi đang sửa đổi trường ngày trong cơ sở dữ liệu bằng cách cộng/trừ chênh lệch UTC dựa trên múi giờ ray được định cấu hình. Ví dụ:

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") 

Không đẹp lắm, nhưng có vẻ như đã hoàn thành công việc.

Các vấn đề liên quan