日期:2014-05-17  浏览次数:20595 次

Hr考勤计算问题-----急急急
班次:
EmpNo  YYMMDD       GO1   OUT1   GO2    OUT2
048901 2013-09-01   NULL  NULL   NULL   NULL
048901 2013-09-02  08:30  12:00  13:00  17:30

048901 2013-09-04  08:40  12:10  13:10  17:40
048901 2013-09-05  08:40  12:10  13:10  17:40

打卡记录:
EmpNo   CardTime
048901  2013-09-02 08:25    
048901  2013-09-02 08:29
048901  2013-09-02 12:12
048901  2013-09-02 12:28
048901  2013-09-02 17:28
048901  2013-09-02 17:35

048901  2013-09-03 08:30
048901  2013-09-03 12:15
048901  2013-09-03 12:50
048901  2013-09-03 17:45

048901  2013-09-04 08:35
048901  2013-09-04 12:35
048901  2013-09-04 12:50
048901  2013-09-04 17:45

048901  2013-09-05 08:35
048901  2013-09-05 12:35
048901  2013-09-05 12:50
048901  2013-09-05 17:45

048901  2013-09-05 17:56
048901  2013-09-05 21:05

打卡记录10分钟内取第一条记录,如果在班次中间(12:00-13:00)只有一条打卡记录,打卡记录离班次哪个时间点较近算哪个班次点的打卡记录。如有迟到、早退优先算作迟到或早退卡。
班次时间为null、没有当天的排班或者在班次外的打卡均算休息时间,考勤结果均算为加班(无排班情况下(周末或者节假日)加班一天最多只能算8小时,有排班(平时)一天最多只能算3小时加班)

最后需要能算出:
1、是否考勤异常;
2、迟到xx分钟
3、早退xx分钟
4、考勤工时:xx小时
5、加班时长:xx小时

根据以上规则得到的结果为:
员工[048901]2013-09-02考勤异常;早退2分钟;迟到0分钟;考勤工时:7.96小时;加班时长:0小时
员工[048901]2013-09-03考勤正常;早退0分钟;迟到0分钟;考勤工时:0.00小时;加班时长:8小时
员工[048901]2013-09-04考勤正常;早退0分钟;迟到0分钟;考勤工时:8.00小时;加班时长:0小时
员工[048901]2013-09-05考勤正常;早退0分钟;迟到0分钟;考勤工时:8.00小时;加班时长:3小时


以上问题可以用MS SQL存储过程计算也可以用java计算,能提供一些思路也好
考勤计算、打卡记录 ms?sql java 存储

------解决方案--------------------
建议分步骤完成,

select * from 班次
/*
EmpNo      YYMMDD          GO1        OUT1       GO2        OUT2