2016-05-21 208 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點進入,並在下午2.00點的第二天離開。 從這如何計算工時對所有員工....如何計算兩個日期之間的總工作時間

+0

您使用的是哪個版本的SQL Server?員工1和2的預期產出是多少? –

+0

這是最小/最大的問題或進出問題? –

+0

員工是否有休息? –

回答

0

測試數據

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

相關問題