2013-11-15 2 views
0

Я пытаюсь получить оценку того, сколько часов человек работал в течение заданного периода времени. Я хочу, чтобы показать это, отдел и в какой области они работают в данный момент у меня есть это:.Рабочие часы и средние часы, проведенные отделом

SELECT M.MemberDepartmentID,T.TaskName, 
    COUNT(DATEDIFF(HOUR, TT.StartTime, TT.EndTime)) 'Hours', 
    AVG(DATEDIFF(HOUR, TT.StartTime, TT.EndTime)) Average 
FROM Member.TaskTracking TT 
    LEFT OUTER JOIN Member.Task T 
     ON TT.TaskID=T.TaskID 
    JOIN dbo.tblMember M 
     ON TT.MemberID=M.MemberID 
WHERE M.FullTime=1 
    AND M.EmployeeSalary=1 
    AND (TT.StartTime >= '2013-10-01' 
    AND TT.EndTime < '2013-11-01') 
GROUP BY M.MemberDepartmentID,T.TaskName 
ORDER BY M.MemberDepartmentID,T.TaskName 

Я не знаю, как проверить, если это правильно, но некоторые из них определенно показывает средние нуля даже если бы работали часы. И некоторые средние показатели выше, чем отработанные часы. Например, вот некоторые из моих результатов:

MemberDepartmentID TaskName  Hours Average 
--------------------------------------------------- 
1     Packing   25  0 
1     Picking   6  0 
1     PreScanning  38  7 
4     Picking   2  104 

Предложения?

+0

Действительно ли начальные и конечные времена всегда имеют значения в базе данных? – StingyJack

+3

Вы хотите использовать счет? Если вы хотите узнать, сколько часов я работал, я думаю, вы хотите использовать сумму. Граф просто скажет вам, сколько там событий, но все они могут быть нулями. – Andrew

+0

@StingyJack - Да, они делают – ash

ответ

8

Во-первых, важно отметить, что 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].

+0

Эй, большое спасибо за все советы! – ash

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