MySQL将列合并到一行_MySQL – 如何将列数据合并为一行

我正在制作一份员工出勤记录,但我很难合并

原始数据分为时间和超时组合格式.

从下面给出的“原始数据”表中

我需要将员工的时间和时间合并为一行

比如下面的“合并时间进/出”示例.

还要考虑员工在白班和夜班都有两个班次.

请注意,如果员工在夜班时间表中

超时日期与日期时间不同.

白班班次(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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值