Sql 计算RubyonRails中项目的平均年龄

Sql 计算RubyonRails中项目的平均年龄,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,我想知道车票的平均年龄。“打开”是我的票证模型上的一个范围。 对于一张票证,这将返回一个很好的结果 time_ago_in_words(Ticket.last.created_at.to_time) 我想做的就是做这样的事情 age = [] Ticket.opened.each do |t| age = time_ago_in_words(t.created_at.to_time)+[] end average_age = age/Ticket.opened.count 我

我想知道车票的平均年龄。“打开”是我的票证模型上的一个范围。 对于一张票证,这将返回一个很好的结果

time_ago_in_words(Ticket.last.created_at.to_time)
我想做的就是做这样的事情

age = []    
Ticket.opened.each do |t|
    age = time_ago_in_words(t.created_at.to_time)+[]
end
average_age = age/Ticket.opened.count

我知道这段代码很糟糕,但这是我解释我要找的东西的最佳尝试。

我相信你可以通过将时间转换为整数并计算平均值来实现这一点。粗略地说:

times = [2.days.ago, 3.days.ago, 4.days.ago]
average_ticket_time = Time.at(times.map(&:to_i).sum / times.count) # convert to ints and get average
time_ago = Time.now - average_ticket_time # time ago from now
readable_time_ago = (time_ago / 60 / 60).round # divide by 60 secs then 60 mins; round to get closest hour
# => 72 (hours ago)
或者在一行中:

((Time.now - (Time.at(times.map(&:to_i).sum / times.count))) / 60 / 60).round
所以,平均来说,72小时前

您还可以除以一个额外的
24
,以天为单位计算时间:在本例中为3天,这就是您在这个简单示例中所期望的

在您的示例中,您的
时间
数组如下所示:

times = Ticket.opened.map { |ticket| ticket.created_at.to_i }
# or perhaps the following, check the performace:
times = Ticket.opened.pluck(:created_at).map(&:to_i)

希望有帮助-让我知道你进展如何。

我相信你可以通过将时间转换为整数并计算平均值来实现这一点。粗略地说:

times = [2.days.ago, 3.days.ago, 4.days.ago]
average_ticket_time = Time.at(times.map(&:to_i).sum / times.count) # convert to ints and get average
time_ago = Time.now - average_ticket_time # time ago from now
readable_time_ago = (time_ago / 60 / 60).round # divide by 60 secs then 60 mins; round to get closest hour
# => 72 (hours ago)
或者在一行中:

((Time.now - (Time.at(times.map(&:to_i).sum / times.count))) / 60 / 60).round
所以,平均来说,72小时前

您还可以除以一个额外的
24
,以天为单位计算时间:在本例中为3天,这就是您在这个简单示例中所期望的

在您的示例中,您的
时间
数组如下所示:

times = Ticket.opened.map { |ticket| ticket.created_at.to_i }
# or perhaps the following, check the performace:
times = Ticket.opened.pluck(:created_at).map(&:to_i)

希望对您有所帮助-让我知道您进展如何。

如果您使用PostgreSQL,那么您可以在单个SQL查询中获取在时间创建的平均

avg_created_at = Ticket.opened.average('extract(epoch from tickets.created_at)')
time_ago_in_words(Time.at(avg_created_at))
函数将创建的
值返回为UTC 1970-01-01 00:00:00以来的秒数。这可以在聚合函数中使用,例如


我相信MySQL也允许这样的查询。

如果您使用PostgreSQL,那么您可以在单个SQL查询中获取在
时间创建的平均值:

avg_created_at = Ticket.opened.average('extract(epoch from tickets.created_at)')
time_ago_in_words(Time.at(avg_created_at))
函数将创建的
值返回为UTC 1970-01-01 00:00:00以来的秒数。这可以在聚合函数中使用,例如


我相信MySQL也允许这样的查询。

很好,非常优雅!我认为它在MySQL上的
avg\u created\u at=Ticket.opened.average('UNIX\u TIMESTAMP(tickets.created\u at')
`回答得好!当有更好的解决办法时,我得说脱帽致敬+1我喜欢这种方法!以下是我在控制器中使用的代码:avg_created_at=Ticket.opened.average('UNIX_TIMESTAMP(tickets.created_at'))和视图中的代码:我遇到了以下错误:无法将FalseClass转换为精确的number@timothywright在你的应用程序中使用MySQL,对吗?您能打开rails控制台并检查
avg\u created\u at=Ticket.opened.average('UNIX\u TIMESTAMP(tickets.created\u at')的结果吗?
?是的,我使用mysql。avg_created_at=Ticket.opened.average('UNIX_TIMESTAMP(tickets.created_at)')(3.7ms)集合名称utf8,@@SESSION.sql_mode=CONCAT(CONCAT(@@sql_mode',STRICT_ALL_TABLES'),',NO_AUTO VALUE_ON_ON_ZERO'),@@SESSION sql_AUTO为null=0,@@SESSION.wait_timeout=2147483(0.8ms)选择avg(UNIX_TIMESTAMP(tickets.created_)从
tickets
WHERE
tickets
状态
=0=>0.15388397325686e10漂亮,非常优雅!我认为它在MySQL上的
avg\u created\u at=Ticket.opened.average('UNIX\u TIMESTAMP(tickets.created\u at')
`回答得好!当有更好的解决办法时,我得说脱帽致敬+1我喜欢这种方法!以下是我在控制器中使用的代码:avg_created_at=Ticket.opened.average('UNIX_TIMESTAMP(tickets.created_at'))和视图中的代码:我遇到了以下错误:无法将FalseClass转换为精确的number@timothywright在你的应用程序中使用MySQL,对吗?您能打开rails控制台并检查
avg\u created\u at=Ticket.opened.average('UNIX\u TIMESTAMP(tickets.created\u at')的结果吗?
?是的,我使用mysql。avg_created_at=Ticket.opened.average('UNIX_TIMESTAMP(tickets.created_at)')(3.7ms)集合名称utf8,@@SESSION.sql_mode=CONCAT(CONCAT(@@sql_mode',STRICT_ALL_TABLES'),',NO_AUTO VALUE_ON_ON_ZERO'),@@SESSION sql_AUTO为null=0,@@SESSION.wait_timeout=2147483(0.8ms)选择avg(UNIX_TIMESTAMP(tickets.created_)从
票据
其中
票据
状态
=0=>0.15388397325686e10