问题描述
- 计算考勤迟到和早退次数
-
有一张表,怎么算11月份这两个人的迟到次数和早退次数,早9晚5,用java或mysql实现
员工id 上班时间 下班时间 是否加班 1是0否
empId starttime endtime isaddwork
1001 2014-11-12 08:50:43 2014-11-12 18:10:43 1
1001 2014-11-13 08:50:43 2014-11-13 17:50:43 0
1002 2014-11-12 09:10:43 2014-11-12 18:04:43 1
1002 2014-11-13 08:50:43 2014-11-13 18:10:43 0
1001 2014-11-14 08:50:43 2014-11-14 18:10:43 1
1001 2014-11-15 08:50:43 2014-11-15 17:50:43 0
1002 2014-11-14 09:10:43 2014-11-14 18:04:43 1
1002 2014-11-15 08:50:43 2014-11-15 18:10:43 0
解决方案
SELECT
SUM(IF(DATE_FORMAT(t.create_date,'%H:%i') > '9:00',1,0)) AS '上班迟到数',
SUM(IF(DATE_FORMAT(t.create_date,'%H:%i') < '17:00',1,0)) AS '下班早退数',
t.empId AS '员工ID',
FROM '打卡表' t
GROUP BY t.empId ;
这样就可以了!记得加下时间过滤条件
解决方案二:
Java代码如下:
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) {
System.out.println(countAttence(2014, 11, "2014-11-12 09:50:43", "2014-11-12 18:10:43"));
}
/**
* 返回0 代表没有迟到早退
* 返回1 代表迟到
* 返回2 代表早退
* 返回3 代表既迟到又早退
* @param year
* @param month
* @param startTime
* @param endTime
* @return
*/
public static int countAttence(int year, int month, String startTime, String endTime){
try {
boolean resultChidao = false;
boolean resultZaotui = false;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = sdf.parse(startTime);
Date end = sdf.parse(endTime);
Date startOk = sdf.parse(year + "-" + month + "-" + start.getDate() + " 09:00:00");
Date endOk = sdf.parse(year + "-" + month + "-" + start.getDate() + " 17:00:00");
if(start.getYear() == year - 1900 && end.getYear() == year - 1900 && start.getMonth() == month -1 && end.getMonth() == month -1){
if(start.after(startOk)){
resultChidao = true;
}
if(end.before(endOk)){
resultZaotui = true;
}
if(resultChidao && resultZaotui){
return 3;
}else if(resultChidao){
return 1;
}else if(resultZaotui){
return 2;
}else{
return 0;
}
}else{
return 0;
}
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return 0;
}
}
解决方案三:
select count(empId) as '迟到人数' from table where to_number(to_char(starttime,'hh'))<9;
解决方案四:
select empId, count(starttime) from table where to_number(to_char(starttime,'hh'))<9 group by empId;
解决方案五:
SELECT
SUM(IF(DATE_FORMAT(t.starttime ,'%H:%i') > '9:00',1,0)) AS '上班迟到数',
SUM(IF(DATE_FORMAT(t.endtime ,'%H:%i') < '17:00',1,0)) AS '下班早退数',
t.empId AS '员工ID',
FROM '打卡表' t
GROUP BY t.empId ;
这个才对!忘记把上班下班时间加上去了