在表 - 日期,时间,人,来源。员工通过检查站时更新了新值,他每天可以多次离开/来。
+---------------+----------+--------+-------------+
| 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 :(得分: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
的表中,并假设当source
以exit
或enter
开头时,我们分别指的是离开或到来。
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)
可能更干净的方式。