我需要取一个名为" 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'
答案 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小时,我相信在彻底调查我的代码实际执行后,您最好自己制作它。
提示:更新第二行和第四行的强制函数