人事考勤系统:多个时间段多笔可能重复打卡数据处理问题,期盼高人出现
请各位达人帮忙看下此问题,小弟初来乍到,不懂规矩的地方请各位达人海涵,问题详细如下:
公司有HR系统,需对其中的报表做一个改善,其中一段SQL语法不会:
有考勤刷卡记录表,表名为attendance ,有如下字段:
姓名 卡号 刷卡时间 刷卡类型 name id time type
张三 59775623 2010-04-01 07:23:37 null
张三 59775623 2010-04-01 07:50:21 null
张三 59775623 2010-04-01 18:20:22 null
张三 59775623 2010-04-01 18:50:53 null
李四 59775624 2010-04-01 07:00:06 null
李四 59775624 2010-04-01 18:00:12 null
李四 59775624 2010-04-02 08:20:32 null
李四 59775624 2010-04-02 17:00:22 null
李四 59775624 2010-04-01 18:00:08 null
.....................................................................................................
以下还有很多,每位员工每天都有,...............
现在需要更新刷卡的数据,需要对表attendance执行一个update动作,根据刷卡时间,需满足如下功能
1.如果刷卡时间是8:00以前,则type的值update之后就为“上班”;
2.如果刷卡时间是17:30以后,则type的值update之后就为“下班”;
3.如果刷卡时间为8:00~~12:00之间,则type的值update之后就为“迟到”;
4.如果刷卡时间为13:00~~17:30之间,则type的值update之后就为“早退”;
5.如果同一个人同一天在12:00以前有多次刷卡,则刷卡时间最早的那一笔记录其type值为“上班”,其余12:00以前的刷卡记录其type值update之后,变为“上班重复刷卡;
6. 如果同一个人同一天在13:00以后有多次刷卡,则刷卡时间最迟的那一笔记录其type值为“下班”,其余13:00以后的刷卡记录其type值update之后,变为“下班重复刷卡;
7.其余每天的任何时间段,update后,type值变为“乱刷卡”
小弟最头痛的是其中的5、6两种情况,可以使用where + group by + haviing count(*)>1将其查出来,update就不知道如何处理了,小弟思考了好几天,也只能做到这一步,实在做不下去了,跑来求助各位达人;
问题补充:
1.请各位达人务必注意那个时间的格式,SQL里面转换时间格式可以使用convert(char(10),time,120),输出为YYYYMMDD;convert(char(8),time,112),输出格式为YYYYMMDD;convert(char(10),time,108),输出为HH-MM-SS