Sql 取集合中所有小时的平均值
我需要取表中名为bitacoratiempo的字段TS的所有小时和分钟的平均值,该字段是varchar类型,其结构是TS:00:05 我可以通过以下方式从varchar更改为time:Sql 取集合中所有小时的平均值,sql,ruby-on-rails,ruby,Sql,Ruby On Rails,Ruby,我需要取表中名为bitacoratiempo的字段TS的所有小时和分钟的平均值,该字段是varchar类型,其结构是TS:00:05 我可以通过以下方式从varchar更改为time: ((@prom_tiempo_visita.TS).to_time.strftime('%H:%M:%S')) 我怎样才能得到所有这些小时和分钟的平均值 我试过这个 @prom_tiempo_visita = Bitacoratiempo.prom_tiempo_visita(params).average(:
((@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'
我假设您需要找到收集时间的平均值 设一个数组为
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')
好的,您已经发现需要转换您的值才能应用平均运算。不幸的是,平均值只能应用于ActiveRecord实例。这意味着您需要在一个普通代码中计算所有数据。 另一个问题是——平均时间是多少?它不能直接应用于与时间相关的数据类型。首先,您需要将它们转换为整数。其中一个明显的方法是将其转换为秒 因此,一步一步: 它仅适用于小于24小时的值。如果您需要它超过24小时,我相信在彻底调查我的代码的实际功能之后,您最好自己制作 提示:更新第二行和第四行上的强制函数
你试过自己做吗?我们可以看看你的代码来修复它吗?@DmitryTonkonogov更新:非常感谢我的朋友,你的代码为我工作。你的代码很有趣,非常好。
# 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")