取一个集合的所有小时的平均值

时间:2016-12-23 02:48:36

标签: sql ruby-on-rails ruby

我需要取一个名为" TS"的字段的所有小时和分钟的平均值。在名为bitacoratiempo的表中,该字段的类型为varchar,其结构为TS:" 00:05" 我已经能够以这种方式从varchar更改为时间:

((@prom_tiempo_visita.TS).to_time.strftime('%H:%M:%S'))

如何获得所有这些小时和分钟的平均值

我试过这个

@prom_tiempo_visita = Bitacoratiempo.prom_tiempo_visita(params).average(:TS)

但是我收到了这个错误:

ActiveRecord::StatementInvalid (TinyTds::Error: Operand data type varchar is invalid for avg operator.: EXEC sp_executesql N'SELECT DISTINCT AVG([bitacoratiempos].[TS]) FROM [bitacoratiempos] left outer join clientes on bitacoratiempos.Codigo=clientes.IdCli WHERE ((bitacoratiempos.RutaId = N''161'' or N''161'' = '''') AND (bitacoratiempos.IdEmpresa = N''208'')) AND (bitacoratiempos.HI >= N''2014-12-01'' AND bitacoratiempos.HI <= N''2016-12-01'')'):
  app/controllers/ventas_controller.rb:20:in `busqueda_general_graficos'

2 个答案:

答案 0 :(得分:1)

我认为您需要找到收集时间的平均值。

让一个数组

time_array = [2016-12-23 10:16:59 +0530, 2016-12-24 11:16:59 +0530, 2016-12-25 12:16:59 +0530, 2016-12-26 13:16:59 +0530, 2016-12-27 14:16:59 +0530, 2016-12-28 15:16:59 +0530, 2016-12-29 16:16:59 +0530, 2016-12-30 17:16:59 +0530, 2016-12-31 18:16:59 +0530, 2017-01-01 19:16:59 +0530]

你可以通过

找到平均值
DateTime.strptime(((time_array.map{|t| t.to_i}.sum)/time_array.size).to_s,'%s')

答案 1 :(得分:1)

好的,您已经发现需要转换值才能应用平均操作。不幸的是,#average只能应用于ActiveRecord实例。这意味着您需要在普通代码中统计所有内容。 另一件事是问题 - 时间的平均值是多少?它不能直接应用于与时间相关的数据类型。首先,您需要将它们转换为整数。其中一个显而易见的方法是将其转换为秒。

所以,一步一步:

# Get all values to find average 
values = Bitacoratiempo.pluck(:TS)
# Convert it to plain integers
conv_values = values.map {|val| Time.parse(val).seconds_since_midnight }
# Then count the average
avg = conv_values.sum / conv_values.length
# Optionally convert it to the string
nice_string = Time.at(avg).utc.strftime("%H:%M:%S")

它仅适用于少于24小时的值。如果您需要超过24小时,我相信在彻底调查我的代码实际执行后,您最好自己制作它。

  

提示:更新第二行和第四行的强制函数