2014-11-05 67 views
-1

請幫助我!如何編寫計數工作時間員工的腳本?

在表 - 日期,時間,人,來源。當員工通過檢查站時,以新值更新,他可以每天離開/來幾次。

+---------------+----------+--------+-------------+ 
| date   | time  |person |source  | 
+---------------+----------+--------+-------------+ 
| 01.08.2014 | 08:42:08 | Name1 | enter1  | 
+---------------+----------+--------+-------------+ 
| 01.08.2014 | 09:42:12 | Name1 | exit1  | 
+---------------+----------+--------+-------------+ 
| 01.08.2014 | 10:22:45 | Name1 | enter2  | 
+---------------+----------+--------+-------------+ 
| 01.08.2014 | 18:09:11 | Name1 | exit2  | 
+---------------+----------+--------+-------------+ 

我需要爲每位員工計算他每天在工作中度過的實際時間。表總是不可編輯的。它由一個csv文件構成。腳本運行一次。

我覺得需要做這樣的事情:

TIMESTAMPDIFF(MINUTE, enterTime, exitTime) 

爲每個員工1天。但我在sql中的知識很差。

+0

您的桌子上沒有進入/退出時間,那麼如何計算花費的時間呢? – 2014-11-05 13:38:27

+1

SQL中的日期遵循特定的格式,並且很少有很好的分離日期和時間的理由。一旦你解決了這些問題,請隨時返回給我們。 – Strawberry 2014-11-05 13:38:52

+0

@Strawberry你是一個downvoting專家 – 2014-11-05 13:39:22

回答

1

日期/時間格式應存儲在日期時間/時間戳列中。有可能將它們轉換,雖然醜陋的(有可能是一個更好的辦法...):

> SELECT CONCAT(STR_TO_DATE('01.08.2014', '%m.%d.%Y'), ' ', '08:42:08'); 
2014-01-08 08:42:08 

現在假設時間爲Unix的時間戳。聘用到達t0並離開t1。他在工作的時間是(t1-t0)秒。現在假設他到達t0,休息時間爲t1,返回時間爲t2,當天離開時間爲t3。他在工作中的總時間是(t1-t0) + (t3-t2) = (t1+t3)-(t0+t2)。一般來說:他在某一天工作的時間是從出發時間總和中減去到達時間的總和。

使用你的時間:

1389188528 enter1 
1389192132 exit1 
1389194565 enter2 
1389222551 exit2 

我們看到,在工作總時間爲:1389222551 + 1389192132 - (1389188528 + 1389194565) = 31590,或約8小時47分鐘。現在剩下的是轉換爲unix時間戳(UNIX_TIMESTAMP())並通過SQL應用此推理。在下面的示例中,我已將數據添加到名爲work_log的表中,並假定sourceexitenter開頭時,我們分別指的是出發或到達。

SELECT person, DATE(dt) AS day, 
    SUM(IF(`source` like 'enter%', -1, 1)*UNIX_TIMESTAMP(dt))/3600 AS hours 
FROM (SELECT CONCAT(STR_TO_DATE(`date`, '%m.%d.%Y'), ' ', `time`) AS `dt`, 
    `person`,`source` FROM work_log) AS wl 
GROUP BY person,day; 

+--------+------------+--------------+ 
| person | day  | hours  | 
+--------+------------+--------------+ 
| Name1 | 2014-01-08 | 8.7750000000 | 
+--------+------------+--------------+ 
1 row in set (0.00 sec) 

可能吸塵器這樣做的方式。

+0

謝謝!許多!這正是我需要的。但是,如果員工在一天之內來到另一天又會怎樣?需要從24:00減去 – 2014-11-06 11:48:21

+0

將'GROUP BY'更改爲'person'將產生所有time_的總計,而不管進入/存在是否在同一天。但進入和存在的數量仍然必須相等。您可以添加一個「WHERE」來查看例如之間的所有時間。第1天0500和第2天0200,但這仍不完美。我不確定在純SQL中處理這個問題的好方法。 – 2014-11-06 14:41:15