2011-08-03 104 views
1

我想計算兩個日期之間的平均時間(以天計)。我想知道每個用戶加入後的天數,並獲得平均值。2日期之間的平均時間ruby

(Date.today - User.first.created_at.to_date).to_i 

適用於特定用戶。現在我想遍歷所有用戶並檢索平均值。如何完成這樣的事情?

+0

或者你可以寫一個查詢直接從數據庫中檢索平均值。 – rubish

+0

在這種情況下查詢的樣子是什麼? – Gaelle

+0

如果您使用的是MySQL,則可以在SELECT SO(DATEDIFF(NOW(),created_at))/ COUNT(id)FROM users'的行上進行操作。 http://dev.mysql.com/doc/refman/5.5/zh-TW/date-and-time-functions.html#function_datediff,http://developer.postgresql.org/pgdocs/postgres/functions-datetime.html – rubish

回答

0

你可以試試這個:

User.all.map{|u| (Date.today - u.created_at.to_date).to_i}.sum/User.count 
+0

不工作我得到了這個錯誤未定義的方法'+'爲#<用戶:0x0000010467f110> – Gaelle

+0

更新回答,simplier – Hck

0

或者你可以試試這個:如果你擴展了Ruby的Array像這樣

User.all.sum { |user| (Time.now - user.created_at)/1.day }.to_i/User.count 

BTW:

class Array 
    def avg(&block) 
    sum(&block).to_i/count 
    end 
end 

,你可以做一個很好的和短版本:

User.all.avg { |user| (Time.now - user.created_at)/1.day } 
+0

但是,這將迭代所有用戶,並且如果有大量用戶將是一個大熱門。 – rubish

+0

是的,這是正確的,但在SQL中編寫它非常依賴於數據庫。我認爲這些問題必須獨立解決,每個應用程序都需要它自己的解決方案。有時通過Ruby迭代Array'並不是什麼壞事,有時它真的會讓屁股感到痛苦。 –

相關問題