2013-01-31 2 views
-5

Я делаю систему посещаемости, в которой я буду добавлять ежемесячные записи о времени работы сотрудника и тайм-ауте. В конце месяца будет создано среднее время и время.Рассчитать среднее значение времени (7) в SQL

Просьба сообщить мне, как применять avg() к типу данных time(7)?

declare @tblPK table 
(
    timeinat varchar(13) not null, 
    timeoutat varchar(13) not null 
) ; 

insert into @tblPK 
select cast((onattendance) as varchar(13))ONTime, 
     cast((offattendance) as varchar(13))OFFTime 
from t_attendancedetails ; 

select * from @tblPK ; 

Это дает только вывод всех записей.

+2

Ваш код не имеет большого смысла. Почему вы не сохраняете timeinat и timeoutat как поля времени? Кроме того, почему вы возвращаете их к тому же типу, который у них уже есть? – JohnFx

+0

чувак, в моей таблице я храню время (7) объект, этот код демонстрирует временную таблицу, в которой я использовал varchar (13). поэтому я хочу только вычислить среднее значение. пожалуйста, предложите. t_attendancedetails таблица содержит объект времени –

+0

нет, я хочу только время, не указанное @MarvinLabs –

ответ

4

Расчет среднего значения с точностью до миллисекунды с использованием столбцов time(7).

select dateadd(millisecond, avg(datediff(millisecond, onattendance, offattendance)), cast('00:00' as time(7))) 
from t_attendancedetails 

Запрос использует datediff, чтобы получить разницу в миллисекундах между onattendance и offattendance. Затем он использует агрегированную функцию avg для вычисления средней разницы в миллисекундах и, наконец, использует dateadd, чтобы добавить среднее число миллисекунд к значению time(7)00:00.

Ref:
DATEDIFF (Transact-SQL)
DATEADD (Transact-SQL)
AVG (Transact-SQL)
CAST and CONVERT (Transact-SQL)

Update:

При расчете среднего значения с точностью time(7) вам нужно разделить время на две части, потому что datediff и dateadd не имеет отношения к bigint.

Величины разности времени преобразуются в наносекунды до того, как вычисляется среднее значение, а преобразование обратно в time(7) выполняется в два этапа, сначала секунды, а затем наносекунды.

declare @T0 time(7) = '00:00:00' 
declare @G bigint = 1000000000 
declare @H bigint = 100   

select dateadd(nanosecond, cast(right(T.A, 9) as int), dateadd(second, T.A/@G, @T0)) 
from 
    (
    select avg(
       @G * datediff(second, @T0, offattendance) + @H * right(offattendance, 7) - 
       @G * datediff(second, @T0, onattendance) + @H * right(onattendance, 7) 
      ) 
    from t_attendancedetails 
) as T(A) 
+0

Теперь это называется РЕАЛЬНЫМ ответом. это сработало. Я новичок в sql, поэтому я мало знаю об этом. :) –

+0

@AtifImtiaz Добавлено немного объяснений. –

+0

Другой способ - просто преобразовать результат датированного результата в bigint: select dateadd (миллисекунда, avg (конвертировать (bigint, датфик (миллисекунда, onattendance, offattendance))), cast ('00: 00 'как время (7))) от t_attendancedetails – Boanerge

Смежные вопросы