我正在制作一份员工出勤记录,但我很难合并
原始数据分为时间和超时组合格式.
从下面给出的“原始数据”表中
我需要将员工的时间和时间合并为一行
比如下面的“合并时间进/出”示例.
还要考虑员工在白班和夜班都有两个班次.
请注意,如果员工在夜班时间表中
超时日期与日期时间不同.
白班班次(ID001,ID002)
夜班empid(ID003)
Raw Data Table
--------------------------------------------
empid date time[in/out] in_out
--------------------------------------------
ID001 2014-08-01 7:00am IN
ID002 2014-08-01 7:01am IN
ID003 2014-08-01 8:05pm IN
ID001 2014-08-01 5:00pm OUT
ID002 2014-08-01 5:01pm OUT
ID003 2014-08-02 6:01am OUT
Merge Time in/out Table
--------------------------------------------
empid date time_in time_out
--------------------------------------------
ID001 2014-08-01 7:00am 5:00pm
ID002 2014-08-01 7:01am 5:01pm
ID003 2014-08-01 8:05pm 6:01am
解决方法:
好的,所以当他的time_out是AM时,你可以判断员工是否在夜班工作.在这种情况下,这是最后一行的情况.
我所做的是确定一个真实的日期字段.这是你离开夜班的前一天,以及任何其他情况下的当前日期
select empid,
IF(RIGHT(timeinout,2)='am' AND in_out='OUT',
DATE_ADD(date, INTERVAL -1 DAY),
date) as realdate,
MAX(if(in_out='IN',timeinout,null)) as time_in,
MAX(if(in_out='OUT',timeinout,null)) as time_out
from shifts
group by empid, realdate
输出
根据表的大小,使用这种方式可能值得为自己保存连接.在几乎任何其他情况下,联接更清晰.
我猜你无法控制输入的格式,所以你必须坚持使用文本作为时间并比较最后2个字符中的am / pm后缀.我觉得这很容易出错,但让我们祈祷原始数据会坚持这种格式.
这个解决方案做了一些假设,我宁愿在这里解释,以避免进一步的误解
>如果他们在白班工作,工人不能上夜班(因为我们按日期分组,你需要一个额外的字段来区分某一天的白班和夜班)
>输入将永远不会比给定日期/员工元组的IN时间更早列出OUT时间(如果发生这种情况,则需要额外的验证步骤以保证输出一致)
>输入将始终包含给定班次的timein和timeout(如果没有,则需要额外的步骤来丢弃orfan timeentries).
标签:mysql
来源: https://codeday.me/bug/20190728/1561533.html