如何编写计算工作时间员工的脚本?

时间:2014-11-05 13:34:36

标签: mysql

请帮助我!

在表 - 日期,时间,人,来源。员工通过检查站时更新了新值,他每天可以多次离开/来。

+---------------+----------+--------+-------------+
| 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知之甚少。

1 个答案:

答案 0 :(得分: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)

可能更干净的方式。