转载

考勤统计问题

老东家就考勤管的严.
上午8:30上班
中午11:30签退,午休
下午13:30签到,开始工作
晚上18点下班.

中午签退的时间范围是 11:30至12点
下午签到的时间范围是 13:00至13:30

HR怕11:30打完卡,下午3点再回来上班.央企都是各色人等。这也造成了人力管理的复杂.

实验结构和数据:
  1. create table t (  
  2.     id int primary key auto_increment,  
  3.     uid varchar(10),  
  4.     ts timestamp  
  5. );  
  6.   
  7. insert into t(uid,ts) values('大柴','2015-12-16 08:20:39');  
  8. insert into t(uid,ts) values('二柴','2015-12-16 08:30:39');  
  9. insert into t(uid,ts) values('大柴','2015-12-16 11:30:39');  
  10. insert into t(uid,ts) values('大柴','2015-12-16 11:45:39');  
  11. insert into t(uid,ts) values('二柴','2015-12-16 11:35:00');  
  12. insert into t(uid,ts) values('大柴','2015-12-16 13:30:39');  
  13. insert into t(uid,ts) values('二柴','2015-12-16 13:20:00');  
  14. insert into t(uid,ts) values('大柴','2015-12-16 18:30:39');  
  15. insert into t(uid,ts) values('二柴','2015-12-16 17:59:00');  
  16. insert into t(uid,ts) values('三柴','2015-12-16 08:28:00');  
  17. insert into t(uid,ts) values('三柴','2015-12-16 17:59:00');  
  18. insert into t(uid,ts) values('小柴','2015-12-16 10:59:00');  
  19. insert into t(uid,ts) values('小柴','2015-12-16 13:59:00');  

考勤统计问题

SQL统计:
  1. select  
  2. ts 日期,    
  3. uid 姓名,  
  4. case   
  5. when t1.a is null then '异常'   
  6. when extract(HOUR_MINUTE from a)<=0829 then a   
  7. when extract(HOUR_MINUTE from a) >0829 then concat('迟到:',a) end 上午上班打卡,  
  8. if(b is null,'异常',b) 上午下班打卡,  
  9. if(c is null,'异常',c) 下午上班打卡,  
  10. case   
  11. when t1.d is null then '异常'   
  12. when extract(HOUR_MINUTE from d)>1759 then d   
  13. when extract(HOUR_MINUTE from d) <=1759 then concat('早退:',d) end 下午下班打卡  
  14. from (  
  15.     select   
  16.         date_format(ts,'%Y-%m-%d') ts,uid,  
  17.         min(  
  18.             case when   
  19.             extract(HOUR_MINUTE from ts)<1130   
  20.             then ts else null end  
  21.         ) a,  
  22.         min(  
  23.             case when   
  24.             extract(HOUR_MINUTE from ts)>=1130 AND   
  25.                 extract(HOUR_MINUTE from ts)<=1159   
  26.             then ts else null end  
  27.         ) b,  
  28.         min(  
  29.             case when   
  30.             extract(HOUR_MINUTE from ts)>=1300 AND   
  31.                 extract(HOUR_MINUTE from ts)<=1329   
  32.             then ts else null end  
  33.         ) c,  
  34.         max(  
  35.             case when   
  36.             extract(HOUR_MINUTE from ts)>1329   
  37.             then ts else null end  
  38.         ) d  
  39.     from t  
  40.     group by   
  41.         date_format(ts,'%Y-%m-%d') ,uid  
  42. ) t1 order by 上午上班打卡;  


考勤统计问题
正文到此结束
Loading...