2013-07-16 78 views
2

我有一個sql代碼,可以獲得每個員工的總工作時間和他的時間。我想計算一天中他工作的總加班時間。你能幫助我嗎? 8小時是每天的固定時間。計算每天的加班

這裏是代碼

SELECT 
    empno, 
    date_created, 
    time_in, 
    time_out, 
    time_format(timediff(time_out, time_in), '%H:%i') AS total_time 
FROM 
(
    SELECT empno, date_created, 
    min(CASE WHEN status = 0 THEN time_created END) time_in, 
    max(CASE WHEN status = 1 THEN time_created END) time_out 
    FROM biometrics 
    WHERE empno = 3 
    GROUP BY empno, date_created 
) t1; 

樣本輸出

empno| date_created | time_in | time_out 
    2  2013-07-15 11:08:07 15:00:00 
    3  2013-07-15 11:50:00 NULL 
    4  2013-07-15 NULL  16:00:00 

什麼,我想是這樣的

empno | date_created | time_in | time_out | overtime 
2  2013-07-15 5:00:00 15:00:00  2 

回答

2

你可以做這樣的事情

SELECT empno, date_created, time_in, time_out, 
     CASE WHEN total_hours - 8 > 0 THEN total_hours - 8 ELSE 0 END overtime 
    FROM 
(
    SELECT empno, date_created, time_in, time_out, 
     TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'), 
           COALESCE(time_in, '09:00:00')))/3600 total_hours 
    FROM 
    (
    SELECT empno, date_created, 
      MIN(CASE WHEN status = 0 THEN time_created END) time_in, 
      MIN(CASE WHEN status = 1 THEN time_created END) time_out 
     FROM biometrics 
    GROUP BY empno, date_created 
) a 
) b 

這裏是SQLFiddle演示

你需要爲time_intime_out的情況下提供真正的默認值時,他們NULL。在極端情況下,如果NULL是由於員工有一天來到前一天回家造成的,那麼這些默認值可能分別爲00:00:0023:59:59,因爲您計算的是每個日曆天的加班時間。

UPDATE:如果你想overtime及時格式

SELECT empno, date_created, time_in, time_out, 
     SEC_TO_TIME(
     CASE WHEN total_sec - 28800 > 0 
       THEN total_sec - 28800 
       ELSE 0 END) overtime 
    FROM 
(
    SELECT empno, date_created, time_in, time_out, 
     TIME_TO_SEC(TIMEDIFF(COALESCE(time_out, '17:00:00'), 
           COALESCE(time_in, '09:00:00'))) total_sec 
    FROM 
    (
    SELECT empno, date_created, 
      MIN(CASE WHEN status = 0 THEN time_created END) time_in, 
      MIN(CASE WHEN status = 1 THEN time_created END) time_out 
     FROM biometrics 
    GROUP BY empno, date_created 
) a 
) b 

呈現以下是SQLFiddle演示

+0

謝謝主席先生。這是我正在尋找的。 –

+0

@MichaelSo你非常歡迎。我很高興我可以幫助:) – peterm

+0

如果我想讓我的輸出成爲時間格式,該怎麼辦? @peterm –

0
SELECT IFNULL(TIMEDIFF('08:00:00',(TIMEDIFF(time_out,time_in))),0) 
AS OVERTIME 
FROM biometrics