Во-первых, важно отметить, что DATEDIFF(HOUR)
возвращает целое число, и это не обязательно дает хорошее отражение того, сколько времени прошло. Например, они оба дают 1
:
SELECT DATEDIFF(HOUR, '03:59', '04:01'); -- 2 minutes (0.033333 hours)
SELECT DATEDIFF(HOUR, '03:01', '04:59'); -- 118 minutes (1.966666 hours)
И они оба дают 0:
SELECT DATEDIFF(HOUR, '03:01', '03:59'); -- 58 minutes (0.966666 hours)
SELECT DATEDIFF(HOUR, '03:01', '03:02'); -- 1 minute (0.016666 hours)
Далее, если вы даете целые SQL Server, чтобы разделить, он будет выполнять целочисленную арифметику. Это будет делить, но он отбросит любой остаток. Это дает 0:
SELECT 3/4;
Даже если на самом деле это 0,75, и если оно округляется оно должно быть равно 1. (Не то, чтобы любой из этих результатов являются особенно значимыми). Теперь увеличьте это до среднего значения.
DECLARE @d1 TABLE(a INT);
INSERT @d1 VALUES(3),(4);
SELECT AVG(a) FROM @d1;
Это дает 3, а не 3.5, которые вы, вероятно, ожидаете. По тем же причинам, что и выше.
Помните, что некоторые из ваших задач могут длиться до 59 минут, но по-прежнему должны иметь пропуск часа в час, вы могли бы иметь, скажем, 4 задания, три, которые длились> 1 час, и один, который продолжался < 1 час. Таким образом, ваш средний расчет по сути будет:
SELECT (1+1+1+0)/4;
Который, как указано выше, по-прежнему дает 0.
Если вы хотите содержательную среднем там, вы должны рассчитать время, проведенное более точно, чем по часам. Например, вы могли бы выполнить DATEDIFF в минутах:
SELECT DATEDIFF(MINUTE, '03:01', '04:59');
Это дает 118. Если вы хотите, чтобы выразить, что в часах, можно разделить на 60,0 (десятичное важно) или умножить на 1,0:
SELECT DATEDIFF(MINUTE, '03:01', '04:59')/60.0;
SELECT 1.0*DATEDIFF(MINUTE, '03:01', '04:59')/60;
Данные оба дают 1.966666. Гораздо более значимым является средний результат. Так что, возможно, изменить свое выражение:
Average = AVG(1.0*DATEDIFF(MINUTE, TT.StartTime, TT.EndTime)/60)
О счете, не уверен, что вы пытаетесь сделать, но вы можете сделать аналогичные поправки к вычислению и вероятно, рассмотреть возможность использования SUM
. Если вы покажете некоторые данные примера и ожидаемые результаты, мы можем помочь вам больше.
Также я рекомендую не избегать псевдонимов ключевых слов с использованием 'single quotes'
- некоторые формы этого синтаксиса устарели, и это делает ваш псевдоним похожим на строковый литерал. Во-первых, постарайтесь не использовать ключевые слова или другие недопустимые идентификаторы в качестве псевдонимов; но если вам нужно, берите их с [square brackets]
.
Действительно ли начальные и конечные времена всегда имеют значения в базе данных? – StingyJack
Вы хотите использовать счет? Если вы хотите узнать, сколько часов я работал, я думаю, вы хотите использовать сумму. Граф просто скажет вам, сколько там событий, но все они могут быть нулями. – Andrew
@StingyJack - Да, они делают – ash