2016-12-23 4 views
-1

Мне нужно усреднить все часы и минуты поля под названием «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

Вы пытались это сделать сами? Можем ли мы увидеть ваш код, чтобы исправить это? –

+0

@DmitryTonkonogov обновлен :) – LuisC

ответ

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 часов, я считаю, что вам лучше сделать это самостоятельно, после тщательного изучения того, что на самом деле делает мой код.

The hint: update coercion functions on the second and fourth lines

+0

большое спасибо моему другу, ваш код работал на меня. Очень интересный ваш код, Отлично. – LuisC

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') 
Смежные вопросы