2011-08-03 37 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'并不是什么坏事,有时它真的会让屁股感到痛苦。 –