2016-05-21 12 views
-1
Emp_id  Logdate 
1  2016-05-04 11:10 
1  2016-05-04 12:20 
1  2016-05-04 13:10 
1  2016-05-04 17:45 
1  2016-05-04 18:10 
1  2016-05-05 02:10  
2  2016-05-04 13:10 
2  2016-05-04 14:20 
2  2016-05-04 15:10 
2  2016-05-04 17:45 
2  2016-05-04 18:10 
2  2016-05-04 20:10 

Из приведенной выше таблицы, как рассчитывать общий рабочий день. вещь - сотрудник, которого я вхожу в 11.00 утра и уезжаю на следующий день в 14:00. Исходя из этого, как рассчитать рабочее время для всех работника ....Как рассчитывать Общее количество рабочих часов между двумя датами

+0

Какую версию SQL Server вы используете? Какова ваша ожидаемая производительность для сотрудников 1 и 2? –

+0

Является ли это вопросом min/max или вопросом ввода/вывода? –

+0

Есть ли у сотрудника перерывы? –

ответ

0

Test Data

Declare @t TABLE (Emp_id INT, Logdate Varchar(30)) 
INSERT INTO @t VALUES 
(1 ,'2016-05-04 11:10'), 
(1 ,'2016-05-04 12:20'), 
(1 ,'2016-05-04 13:10'), 
(1 ,'2016-05-04 17:45'), 
(1 ,'2016-05-04 18:10'), 
(1 ,'2016-05-05 02:10'), 
(2 ,'2016-05-04 13:10'), 
(2 ,'2016-05-04 14:20'), 
(2 ,'2016-05-04 15:10'), 
(2 ,'2016-05-04 17:45'), 
(2 ,'2016-05-04 18:10'), 
(2 ,'2016-05-04 20:10') 

Запрос

; WITH X AS(
Select Emp_id 
     , CONVERT(DATETIME, Logdate) AS Logdate 
     , ROW_NUMBER() OVER (PARTITION BY Emp_id 
        ORDER BY CONVERT(DATETIME, Logdate)) rn 
from @t 
),Y AS(
SELECT Emp_id 
     ,Logdate LogDateTime 
     ,CASE WHEN rn % 2 =1 THEN 0 
      WHEN rn % 2 =0 THEN 1 
     END [InOut] 
     ,CONVERT(DATE, Logdate) Logdate 
     ,rn 
FROM X 
),WorkingHours AS (
SELECT Y.Emp_id 
     ,Y.LogDateTime TimeIn 
     ,YY.LogDateTime TimeOut 
     ,DATEDIFF(MINUTE, Y.LogDateTime,YY.LogDateTime) *1.00/60.0 HoursWorked 
     ,Y.Logdate  DateWoked 
FROM Y 
LEFT JOIN Y AS YY ON Y.Emp_id = YY.Emp_id 
       AND Y.rn = YY.rn - 1 
       AND Y.InOut = 0 
WHERE Y.InOut <> 1) 
Select Emp_id 
     ,CAST(ROUND(SUM(HoursWorked) ,2) AS DECIMAL(10,2)) TotalHours 
     ,DateWoked 
FROM WorkingHours 
GROUP BY Emp_id, DateWoked 

Результат Набор

╔════════╦════════════╦════════════╗ 
║ Emp_id ║ TotalHours ║ DateWoked ║ 
╠════════╬════════════╬════════════╣ 
║  1 ║ 13.75  ║ 2016-05-04 ║ 
║  2 ║ 5.75  ║ 2016-05-04 ║ 
╚════════╩════════════╩════════════╝ 
+0

За исключением первой и последней записи другие считаются перерывами .. Поэтому мы должны принимать только первую и последнюю запись как TOTALWORKING HOURS. Другие рассчитаны как BREAK DURATION .. – Gowthaman

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