很抱歉问到另一个基于出勤率的问题,但是这里的其他解决方案似乎都不适合我。
我需要每天获取每位员工的“先进先出”列表。表看起来像这样:
id date_time access emp_id
1 2016-01-01T09:00:00Z In 00101
2 2016-01-01T09:10:00Z In 00302
3 2016-01-01T13:10:00Z Out 00101
4 2016-01-01T13:05:00Z Out 00302
5 2016-01-01T14:00:00Z In 00302
6 2016-01-01T14:10:00Z In 00101
7 2016-01-01T17:00:00Z Out 00101
8 2016-01-01T17:10:00Z Out 00302
9 2016-01-02T09:05:00Z In 00101
10 2016-01-02T09:10:00Z In 00302
11 2016-01-02T12:05:00Z Out 00101
12 2016-01-02T12:35:00Z Out 00302
13 2016-01-02T13:40:00Z In 00302
14 2016-01-02T17:15:00Z Out 00302
15 2016-01-03T08:50:00Z In 00302
16 2016-01-03T17:10:00Z Out 00101
我需要这样的结果:
workday emp_id entry_time entry_time
2016-01-01 00101 2016-01-01T09:00:00Z 2016-01-01T17:00:00Z
2016-01-01 00302 2016-01-01T09:10:00Z 2016-01-01T17:10:00Z
2016-01-02 00101 2016-01-02T09:05:00Z 2016-01-02T12:05:00Z
2016-01-02 00302 2016-01-02T09:10:00Z 2016-01-02T17:15:00Z
2016-01-03 00302 2016-01-03T08:50:00Z 0
2016-01-03 00101 0 2016-01-03T17:10:00Z
因此,在第2天,我知道有1名员工离开去吃午餐,并且没有回来。在第3天时,一些员工一直在忙活,需要对通行证使用情况进行讲座。
我的问题是,要获得最小/最大时间不是那么简单,因为它们基于访问类型。单独获取进入或退出时间并不难,但由于MYSQL缺少完整的外部联接,因此将它们组合到1个结果表中非常棘手。
select cast(date_time as date) as workday, emp_id, min(date_time) as entry_time from attendance where access = 'In' group by date(date_time), emp_id order by workday;
select cast(date_time as date) as workday, emp_id, max(date_time) as exit_time from attendance where access = 'Out' group by date(date_time), emp_id order by workday;
如果我在尝试对这些语句进行左/右联接时也没有提供我相当抱歉的尝试,请原谅。
我所能管理的最好的是将进入和退出时间放在单独的行上,这并不理想。
select cast(date_time as date) as workday, emp_id, IF (access = 'In', MIN(date_time), 0) as entry_time, IF (access = 'Out', MAX(date_time), 0) as exit_time from attendance group by date(date_time), emp_id, access order by workday;
产生:
workday emp_id entry_time exit_time
2016-01-01 00101 2016-01-01 09:00:00 0
2016-01-01 00101 0 2016-01-01 17:00:00
2016-01-01 00302 2016-01-01 09:10:00 0
2016-01-01 00302 0 2016-01-01 17:10:00
2016-01-02 00101 2016-01-02 09:05:00 0
2016-01-02 00101 0 2016-01-02 12:05:00
2016-01-02 00302 2016-01-02 09:10:00 0
2016-01-02 00302 0 2016-01-02 17:15:00
2016-01-03 00101 0 2016-01-03 17:10:00
2016-01-03 00302 2016-01-03 08:50:00 0
What I have tried on SQL Fiddle
有什么我想念的吗?有更好的做事方法吗?
感谢您的协助,在此先感谢您。
最佳答案
我认为您需要再做一个group by
。见下文:
select p.workday, p.emp_id, max(p.time_in), max(p.time_out)
from (
select cast(date_time as date) as workday, emp_id,
min(case when (access='In') then date_time else 0 end) as time_in,
max(case when (access='Out') then date_time else 0 end) as time_out
from attendance
group by cast(date_time as date), emp_id, access
) as p
group by p.workday, p.emp_id
这将产生您的预期结果。这是一个demo
关于mysql - 在MYSQL中每天获取每位员工的后进先出时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57619514/