sql语句实现-计算考勤迟到和早退次数

问题描述

计算考勤迟到和早退次数

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


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

时间: 2024-09-17 14:21:58

sql语句实现-计算考勤迟到和早退次数的相关文章

server-使用SQL语句用计算的方式筛选数据

问题描述 使用SQL语句用计算的方式筛选数据 我有4列数据 序号 数量 1 100 2 23 3 37 4 45 然后我想数量输入 150 带出数据 序号 数量 1 100 2 23 3 27 这个怎么用SQL语句操作? 解决方案 你想要表达什么意思?说明白点... 解决方案二: 自己用存储过程搞定了,谢谢大家

思路请交,关于填充dataset后,再多次使用sql语句的问题

问题描述 小弟碰到如下问题:客户需要查询的数据是从服务器上的一张表取得,但这张表不能直接用,需要用自定义函数拆分字段,然后多次使用sql语句加工计算,.现在的做法,是程序中,直接连接数据库,建立临时表,然后在临时表中多时使用sql加工,最后输出结果,这样的后果是,服务器端的负载很大,客户查询的时间很长,现在想换个思路做,大致是这样,先把原始数据从服务器的中拉下来到本地的dataset中,然后断开和服务器的连接,就利用这个dataset,多次调用sql加工,最后输出结果,不需要写回数据源,但问题是

SQL语句练习实例之三——平均销售等待时间_MsSql

复制代码 代码如下: ---1.平均销售等待时间 ---有一张Sales表,其中有销售日期与顾客两列,现在要求使用一条SQL语句实现计算 --每个顾客的两次购买之间的平均天数 --假设:在同一个人在一天中不会购买两次 create table sales ( custname varchar(10) not null, saledate datetime not null ) go insert sales select '张三','2010-1-1' union select '张三','20

SQL语句练习实例之三——平均销售等待时间

复制代码 代码如下: ---1.平均销售等待时间 ---有一张Sales表,其中有销售日期与顾客两列,现在要求使用一条SQL语句实现计算 --每个顾客的两次购买之间的平均天数 --假设:在同一个人在一天中不会购买两次 create table sales ( custname varchar(10) not null, saledate datetime not null ) go insert sales select '张三','2010-1-1' union select '张三','20

oracle sql语句 求sql语句

问题描述 oracle sql语句 求sql语句 数据源: 图片自动说明: 日期,投诉次数,分公司ID,分公司,投诉类别 环比:取查询日期的前一天,如:20150720,环比20150719 结果: 每万用户投诉比 每万用户投诉比环比增幅 个人投诉总次数 个人投诉环比增幅 集团投诉总次数 集团投诉环比增幅 解决方案 oracle sql语句优化Oracle用SQL语句分页 解决方案二: 分公司总用户数都没有,哪里来的每万用户投诉比? 解决方案三: 用decode吧,参考这个sql select

求问怎么写sql语句来表示按数量计算?

问题描述 求问怎么写sql语句来表示按数量计算? 这三张表格可以写出sql吗可以按数量进行查询 解决方案 SELECT count(t.counts),max(t.type) FROM table t GROUP BY t.year,t.type; 其中: counts字段:表示保存数量的字段 type字段:区分配件类型的字段(配件A.配件B) 希望对你有帮助! 解决方案二: 求以下SQL语句怎么写

mysql每半小时平均值计算的sql语句_Mysql

表结构: CREATE TABLE `instance` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `timestamp` int(10) unsigned DEFAULT NULL, `cpu` decimal(8,3) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; 统计每半小时平均值,实现可以如下: select `timestamp`-`timestamp`% (5*60) , a

sql语句按身份证计算出生日期、

问题描述 sql语句按身份证计算出生日期. 根据身份证显示出生年月日 解决方案 ql语句按身份证计算出生日. 解决方案二: sql 根据出生日期计算年龄 解决方案三: MSSQL:selcet CONVERT(date,SUBSTRING(身份证号,7,8)) from test; mysql:selcet STR_TO_DATE(SUBSTRING(SID,7,8),'%Y%m%D') from test; oracel:select TO_DATE(SUBSTR(身份证号,7,8),'YYY

SQL语句计算两个日期之间有多少个工作日的方法_MsSql

/* 因为工作中一个奇怪的需求,要用SQL语言计算两个日期间有多少个工作日. 设定是一个星期有5个工作日,从星期一到星期五 说明:   第一个星期的工作日数:DATEPART(dw, @begdt)-DATEPART(dw, @begdt),最少0天   末一个星期的工作日数:DATEPART(dw, @enddt),最多5天 计算方法:   如果两个日期处在同一个星期内,直接计算"第一个星期的工作日数"   否则按下面的公式计算     (两个日期间的总天数 - 第一个星期的天数 -