2 lfc255 lfc255 于 2014.12.04 17:14 提问

计算考勤迟到和早退次数

有一张表,怎么算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

5个回答

shendixiong
shendixiong   2014.12.04 18:16
已采纳

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 ;

 这样就可以了!记得加下时间过滤条件
Kelley_cfy
Kelley_cfy   2014.12.04 17:55

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;
}
}

XIXI_0921
XIXI_0921   2014.12.04 17:56

select count(empId) as '迟到人数' from table where to_number(to_char(starttime,'hh'))<9;

lfc255
lfc255 我要统计的是11月份每个人次数。。在看看谢谢
接近 3 年之前 回复
XIXI_0921
XIXI_0921   2014.12.04 18:08

select empId, count(starttime) from table where to_number(to_char(starttime,'hh'))<9 group by empId;

shendixiong
shendixiong 他用的是Mysql,而且还有早退的哦!
接近 3 年之前 回复
shendixiong
shendixiong   2014.12.04 18:20

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 ;


这个才对!忘记把上班下班时间加上去了

lfc255
lfc255 谢谢
接近 3 年之前 回复
lfc255
lfc255 谢谢
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片