我正在制作一份员工出勤记录,但我很难合并 原始数据分为时间和超时组合格式。
从下面给出的“原始数据”表中 我需要将员工的时间和时间合并为一行 比如下面的“合并时间进/出”示例。
还要考虑员工在白班和夜班有两个班次。 请注意,如果员工在夜班时间表中 超时日期与日期时间不同。
日班转换(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 <--Night Shift
ID001 2014-08-01 5:00pm OUT
ID002 2014-08-01 5:01pm OUT
ID003 2014-08-02 6:01am OUT <--take note of date
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
答案 0 :(得分:4)
select r1.empid,
r1.date,
r1.time as time_in,
r2.time as time_out
from raw_Data r1
inner join raw_data r2 on r1.empid = r2.empid
where r1.in_out = 'IN'
and r2.in_out = 'OUT';
答案 1 :(得分:2)
好的,所以当他的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后缀进行比较。我觉得这很容易出错,但让我们祈祷原始数据会坚持这种格式。
这个解决方案做了一些假设,我宁愿在这里解释,以避免进一步的误解
答案 2 :(得分:1)
尝试此查询并告诉我它是否有效
SELECT empid,
date,
MAX(CASE WHEN in_out = 'IN' THEN time ELSE '' END) time_in,
MAX(CASE WHEN in_out = 'OUT' THEN time ELSE '' END) time_out
FROM Raw Data
GROUP BY empid, date