急,高分求答!写一段mysql脚本,查询某个部门所有员工的考勤明细和考勤状态,要完整可用的sql脚本

有四张表,分别是部门,员工,签到,时间(是否工作日),表结构如下:

部门department:

图片说明

员工employee:
图片说明

签到sign_record:
图片说明

时间deal_calendar:

图片说明

表结构和测试数据sql脚本:

/*
Navicat MySQL Data Transfer

Source Server         : guangda
Source Server Version : 80013
Source Host           : 127.0.0.1:3306
Source Database       : guangda

Target Server Type    : MYSQL
Target Server Version : 80013
File Encoding         : 65001

Date: 2019-01-25 09:08:09
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for deal_calendar
-- ----------------------------
DROP TABLE IF EXISTS `deal_calendar`;
CREATE TABLE `deal_calendar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `date` date DEFAULT NULL COMMENT '交易日历表',
  `isDealDay` varchar(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'N' COMMENT '是否交易日,Y是,N不是',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of deal_calendar
-- ----------------------------
INSERT INTO `deal_calendar` VALUES ('1', '2018-09-01', 'N');
INSERT INTO `deal_calendar` VALUES ('2', '2018-09-02', 'N');
INSERT INTO `deal_calendar` VALUES ('3', '2018-09-03', 'Y');
INSERT INTO `deal_calendar` VALUES ('4', '2018-09-04', 'Y');
INSERT INTO `deal_calendar` VALUES ('5', '2018-09-05', 'Y');
INSERT INTO `deal_calendar` VALUES ('6', '2018-09-06', 'Y');
INSERT INTO `deal_calendar` VALUES ('7', '2018-09-07', 'Y');
INSERT INTO `deal_calendar` VALUES ('8', '2018-09-08', 'N');
INSERT INTO `deal_calendar` VALUES ('9', '2018-09-09', 'N');
INSERT INTO `deal_calendar` VALUES ('10', '2018-09-10', 'Y');
INSERT INTO `deal_calendar` VALUES ('11', '2018-09-11', 'Y');
INSERT INTO `deal_calendar` VALUES ('12', '2018-09-12', 'Y');
INSERT INTO `deal_calendar` VALUES ('13', '2018-09-13', 'Y');
INSERT INTO `deal_calendar` VALUES ('14', '2018-09-14', 'Y');
INSERT INTO `deal_calendar` VALUES ('15', '2018-09-15', 'N');
INSERT INTO `deal_calendar` VALUES ('16', '2018-09-16', 'N');
INSERT INTO `deal_calendar` VALUES ('17', '2018-09-17', 'Y');
INSERT INTO `deal_calendar` VALUES ('18', '2018-09-18', 'Y');
INSERT INTO `deal_calendar` VALUES ('19', '2018-09-19', 'Y');
INSERT INTO `deal_calendar` VALUES ('20', '2018-09-20', 'Y');
INSERT INTO `deal_calendar` VALUES ('21', '2018-09-21', 'Y');
INSERT INTO `deal_calendar` VALUES ('22', '2018-09-22', 'N');
INSERT INTO `deal_calendar` VALUES ('23', '2018-09-23', 'N');
INSERT INTO `deal_calendar` VALUES ('24', '2018-09-24', 'Y');
INSERT INTO `deal_calendar` VALUES ('25', '2018-09-25', 'Y');
INSERT INTO `deal_calendar` VALUES ('26', '2018-09-26', 'Y');
INSERT INTO `deal_calendar` VALUES ('27', '2018-09-27', 'Y');
INSERT INTO `deal_calendar` VALUES ('28', '2018-09-28', 'Y');
INSERT INTO `deal_calendar` VALUES ('29', '2018-09-29', 'N');
INSERT INTO `deal_calendar` VALUES ('30', '2018-09-30', 'N');

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序列号',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部门名字',
  `status` int(11) DEFAULT NULL COMMENT '部门状态 0不可用,1可用',
  `no_permission_floors` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '无权限进入的门',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES ('1', '固定收益部', '1', null);
INSERT INTO `department` VALUES ('2', '资本市场部', '1', null);

-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序列号',
  `faceId` varchar(255) DEFAULT NULL COMMENT '注册人脸库人脸id',
  `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '员工姓名',
  `empNO` varchar(64) NOT NULL COMMENT '员工编号',
  `cardNO` int(32) DEFAULT NULL,
  `postId` int(11) DEFAULT NULL COMMENT '关联岗位表id',
  `dept` int(11) DEFAULT NULL COMMENT '关联部门表id',
  `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '员工密码',
  `entryTime` date DEFAULT NULL COMMENT '入职时间',
  `birthday` date DEFAULT NULL COMMENT '员工生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别,M男,F女',
  `isblacklist` int(2) DEFAULT '0' COMMENT '是否黑名单 0不是,1是',
  `vip` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT 'N' COMMENT '是否vip,N不是,Y是',
  `tel` varchar(12) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '电话号码',
  `img` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '头像地址',
  `status` int(2) DEFAULT '1' COMMENT '0无效,1有效',
  `faceToken` varchar(255) DEFAULT NULL COMMENT '人脸token',
  `updateTime` datetime DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注,VIP客户企业',
  UNIQUE KEY `主索引` (`id`),
  UNIQUE KEY `uk_empNo` (`empNO`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES ('1', null, '张三', 'zhangsan', '1', null, '1', null, null, '1990-10-12', 'F', '0', 'N', null, null, '1', 'zhangsan', null, null);
INSERT INTO `employee` VALUES ('2', null, '李四', 'lisi', '3', null, '1', null, null, '1982-12-16', 'M', '0', 'N', null, null, '1', 'lisi', null, null);
INSERT INTO `employee` VALUES ('3', null, '王五', 'wangwu', '2', null, '2', null, null, '1990-02-01', 'M', '0', 'N', null, null, '1', 'wangwu', null, null);

-- ----------------------------
-- Table structure for sign_record
-- ----------------------------
DROP TABLE IF EXISTS `sign_record`;
CREATE TABLE `sign_record` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '序列号',
  `empNO` varchar(32) DEFAULT NULL COMMENT '员工号',
  `confidence` float DEFAULT NULL COMMENT '比对相似度',
  `cardNo` varchar(32) DEFAULT NULL COMMENT '门禁卡号',
  `signTime` datetime DEFAULT NULL COMMENT '签到时间',
  `deviceNo` int(11) DEFAULT NULL COMMENT '设备号',
  `imagePath` varchar(255) DEFAULT NULL COMMENT '头像路径',
  `type` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '0' COMMENT '类型,0普通,1生日,2入职100天,3入职1000天,4,最早到,5本月全勤,6陌生人,7黑名单,8领导层',
  `IO` char(1) DEFAULT NULL COMMENT '进出标识',
  `source` int(1) DEFAULT NULL COMMENT '打卡数据来源,0人',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  UNIQUE KEY `主索引` (`id`),
  KEY `index_sign_time` (`signTime`)
) ENGINE=InnoDB AUTO_INCREMENT=63 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of sign_record
-- ----------------------------
INSERT INTO `sign_record` VALUES ('8', 'zhangsan', null, '1', '2018-09-24 19:59:33', '512', null, '4', null, '0', '');
INSERT INTO `sign_record` VALUES ('9', 'wangwu', null, '2', '2018-09-24 20:00:26', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('24', 'lisi', null, '3', '2018-09-24 07:32:53', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('26', 'lisi', null, '3', '2018-09-24 18:53:42', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('59', 'lisi', null, '3', '2018-09-30 09:08:37', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('60', 'lisi', null, '3', '2018-09-30 18:09:16', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('61', 'kesc', null, '2', '2018-09-29 07:20:58', '512', null, '0', null, '0', null);
INSERT INTO `sign_record` VALUES ('62', 'zhangsan', null, '1', '2018-09-26 12:22:01', '512', null, '0', null, '0', null);

完整需求:
1.员工号,姓名,月份,工作日天数,是否全勤,正常天数,迟到天数,早退天数,迟到加早退天数,全天缺席天数
2.员工号,姓名,日期,考勤类别(正常,迟到,早退,迟到加早退,全天缺席)

补充:早上8点后迟到,下午5点半前早退,非工作日加班不用计算迟到或早退

0
qq_21741673
洗洗脚泡泡澡 速度啊、这个字段我先放着
5 个月之前 回复

3个回答

你这个如果忘记打卡是缺勤还是算啥

在你的数据基础上写的。
先写第二个,第一个在第二个基础上统计下就行了。

-- 员工号,姓名,日期,考勤类别(正常,迟到,早退,迟到加早退,全天缺席)
-- 补充:早上8点后迟到,下午5点半前早退,非工作日加班不用计算迟到或早退
SELECT
    deal.date,
    employee.name,
    tab.empNO,
    tab.cqType 
FROM
    deal_calendar AS deal
    INNER JOIN (
    SELECT
    CASE

        WHEN
            MIN( signTime ) <= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
            AND MAX( signTime ) >= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
            THEN
                '正常' 
                WHEN COUNT( empNO ) = 1 
                THEN
                '打卡一次,算迟到还是算早退呢' 
                WHEN MIN( signTime ) > CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
                AND MAX( signTime ) > CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
                THEN
                    '迟到' 
                    WHEN MIN( signTime ) <= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
                    AND MAX( signTime ) < CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
                    THEN
                        '早退' ELSE '迟到加早退' 
                        END AS 'cqType',
                    empNO,
                    DATE_FORMAT( signTime, '%Y-%m-%d' ) AS date 
                FROM
                    sign_record 
                GROUP BY
                    DATE_FORMAT( signTime, '%Y-%m-%d' ),
                    empNO 
                ) AS tab ON tab.date = deal.date 
        LEFT JOIN employee AS employee ON employee.empNO = tab.empNO
            WHERE
                deal.isDealDay = 'Y'
                -- 筛选指定月份
            -- AND DATE_FORMAT(deal.date,'%Y-%m') ='2018-09'    
UNION ALL
            SELECT
                deal.date,
                employee.name,
                employee.empNO,
                '全天缺勤' 
            FROM
                deal_calendar AS deal
                LEFT JOIN employee AS employee ON deal.date = deal.date
                LEFT JOIN sign_record AS sign ON sign.empNO = employee.empNO 
                AND deal.date = DATE_FORMAT( sign.signTime, '%Y-%m-%d' ) 
            WHERE
                deal.isDealDay = 'Y' 
                AND sign.id IS NULL 
                -- 筛选指定月份
                -- AND DATE_FORMAT(deal.date,'%Y-%m') ='2018-09'
        ORDER BY
    date ASC

测试结果
图片说明

第一个在第二个sql上统计下

-- 员工号,姓名,月份,工作日天数,是否全勤,正常天数,迟到天数,早退天数,迟到加早退天数,全天缺席天数

SELECT
tab.`name`,
tab.empNO,
    DATE_FORMAT(tab.date,'%c') AS month,
    COUNT(tab.cqType) AS workCount,
    COUNT(tab.cqType ='正常' or null) AS normalCount,
    COUNT(tab.cqType ='迟到' or null) AS lateCount,
    COUNT(tab.cqType ='早退' or null) AS earlyCount,
    COUNT(tab.cqType ='迟到加早退' or null) AS lateAndEarlyCount,
    COUNT(tab.cqType ='全天缺勤' or null) AS absenteeismCount,
    COUNT(tab.cqType ='打卡一次,算迟到还是算早退呢' or null) AS absenteeismCount

FROM (
SELECT
    deal.date,
    employee.name,
    tab.empNO,
    tab.cqType 
FROM
    deal_calendar AS deal
    INNER JOIN (
    SELECT
    CASE

        WHEN
            MIN( signTime ) <= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
            AND MAX( signTime ) >= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
            THEN
                '正常' 
                WHEN COUNT( empNO ) = 1 
                THEN
                '打卡一次,算迟到还是算早退呢' 
                WHEN MIN( signTime ) > CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
                AND MAX( signTime ) > CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
                THEN
                    '迟到' 
                    WHEN MIN( signTime ) <= CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 08:00:00' ) 
                    AND MAX( signTime ) < CONCAT( DATE_FORMAT( signTime, '%Y-%m-%d' ), ' 17:30:00' ) 
                    THEN
                        '早退' ELSE '迟到加早退' 
                        END AS 'cqType',
                    empNO,
                    DATE_FORMAT( signTime, '%Y-%m-%d' ) AS date 
                FROM
                    sign_record 
                GROUP BY
                    DATE_FORMAT( signTime, '%Y-%m-%d' ),
                    empNO 
                ) AS tab ON tab.date = deal.date 
        LEFT JOIN employee AS employee ON employee.empNO = tab.empNO
            WHERE
                deal.isDealDay = 'Y'

UNION ALL
            SELECT
                deal.date,
                employee.name,
                employee.empNO,
                '全天缺勤' 
            FROM
                deal_calendar AS deal
                LEFT JOIN employee AS employee ON deal.date = deal.date
                LEFT JOIN sign_record AS sign ON sign.empNO = employee.empNO 
                AND deal.date = DATE_FORMAT( sign.signTime, '%Y-%m-%d' ) 
            WHERE
                deal.isDealDay = 'Y' 
                AND sign.id IS NULL 
) AS tab
-- 年份筛选
-- WHERE DATE_FORMAT(tab.date,'%Y') = '2018'
GROUP BY DATE_FORMAT(tab.date,'%m'),tab.empNO

测试结果
图片说明

你这个筛选条件应该是要添加的吧,感觉这样的表设计,sql报表好难啊。
有什么问题在沟通!
希望采纳,谢谢

0
it_zhangwei
路漫漫兮其修远兮 回复September_Lhi: 好
5 个月之前 回复
September_Lhi
September_Lhi 回复路漫漫兮其修远兮: 方便加给微信嘛,18656037803
5 个月之前 回复
it_zhangwei
路漫漫兮其修远兮 回复September_Lhi: 22和23不是工作日啊
5 个月之前 回复
it_zhangwei
路漫漫兮其修远兮 回复September_Lhi: 这个错误需要ONLY_FULL_GROUP_BY,否则意思就是你select的列都需要出现在group by中
5 个月之前 回复
it_zhangwei
路漫漫兮其修远兮 回复September_Lhi: 来了
5 个月之前 回复
September_Lhi
September_Lhi 回复路漫漫兮其修远兮: 运行第一段,报了个错,[Err] 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'guangda.sign_record.signTime' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
5 个月之前 回复
September_Lhi
September_Lhi 回复路漫漫兮其修远兮: 可以加你微信吗,方便请教大佬
5 个月之前 回复
September_Lhi
September_Lhi 回复路漫漫兮其修远兮:两张测试的结果图你贴的是一样的,没有9月22好9月23的打卡记录啊
5 个月之前 回复
it_zhangwei
路漫漫兮其修远兮 直接给sql拷贝就可以用了
5 个月之前 回复
SELECT 员工号,卡号,姓名,日期,
       '打卡记录'  AS 考勤类型,
       Substring(日期, 1, 4)   AS 年份,
       Substring(日期, 6, 2)   AS 月份,
       Datename(weekday, 日期) AS 工作日类型,
       Min(打卡时间)             AS 上班打卡时间,
       Max(打卡时间)             AS 下班打卡时间,
       CASE
         WHEN Datename(weekday, 日期) <> '星期六'
              AND Datename(weekday, 日期) <> '星期日' THEN( CASE
                                                         WHEN Min(打卡时间) = Max(打卡时间) THEN'上班或下班忘打卡'
                                                         WHEN Min(打卡时间) > '08:00:00' THEN '迟到'
                                                         WHEN Max(打卡时间) < '17:00:00' THEN '早退'
                                                         ELSE '正常'
                                                       END )
         ELSE '非工作日打卡'
       END                   AS 状态
FROM   (SELECT a.[emp_id]                        员工号,
               a.[card_id]                       卡号,
               b.[emp_fname]                     姓名,
               CONVERT(CHAR(10), sign_time, 120) 日期,
               CONVERT(VARCHAR, sign_time, 108)  打卡时间,
               [sign_time]
        FROM   [dbo].[TimeRecords] a
               LEFT JOIN [dbo].[Employee] b
                      ON a.emp_id = b.emp_id
                         AND a.[card_id] = b.[card_id]
        WHERE  a.emp_id IS NOT NULL
               AND a.emp_id <> ''
               AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-09-01' AND '2018-10-30'
               AND b.[emp_fname] = '姓名') AS mm
GROUP  BY mm.员工号,
          卡号,
          姓名,
          mm.日期
ORDER  BY 员工号,
          日期 ASC 

0
September_Lhi
September_Lhi FROM (SELECT a.[emp_id] 这一段看不懂,运行的时候也报错了啊,You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[ emp_id ] 员工号, a.[ card_id ] 卡号, b.[ emp_fname ] 姓名, ' at line 33
4 个月之前 回复

第一个需求:
存储过程创建:

CREATE PROCEDURE check_work_proc(in deptid INT)
BEGIN
SELECT t1.empNO as ep,t1.name,CONCAT(YEAR(signTime),'-',MONTH(signTime)) AS months,
(SELECT COUNT(*) FROM deal_calendar WHERE CONCAT(YEAR(date),'-',MONTH(date))=months AND isDealDay='y') AS 工作日天数,
CASE WHEN (SELECT COUNT(DISTINCT CONCAT(YEAR(signTime),'-',MONTH(signTime),'-',DAY(signTime))) FROM sign_record WHERE CONCAT(YEAR(signTime),'-',MONTH(signTime))=months AND empNO=ep)=(SELECT COUNT(*) FROM deal_calendar WHERE CONCAT(YEAR(date),'-',MONTH(date))=months) then 'y' ELSE 'n' END    AS 是否全勤,
(SELECT COUNT(*) FROM (SELECT DATE(signTime) AS dt,empNO FROM sign_record WHERE signTime in(SELECT min(signTime) FROM sign_record GROUP BY date(signTime)) AND DATE_FORMAT(signTime,"%H:%i:%s")<='08:00:00') t3
INNER JOIN
(SELECT DATE(signTime) AS dt,empNO FROM sign_record WHERE signTime in(SELECT max(signTime) FROM sign_record GROUP BY date(signTime)) AND DATE_FORMAT(signTime,"%H:%i:%s")>='17:30:00') t4
ON 
t3.dt=t4.dt AND t3.empNO=t4.empNO
WHERE t3.empNO=ep AND CONCAT(YEAR(t3.dt),'-',MONTH(t3.dt))=months)
AS 正常天数,
(SELECT COUNT(*) FROM sign_record WHERE signTime in(SELECT min(signTime) FROM sign_record WHERE empNO=ep AND CONCAT(YEAR(signTime),'-',MONTH(signTime))=months GROUP BY date(signTime)) AND DATE_FORMAT(signTime,"%H:%i:%s")>'08:00:00' AND DATE(signTime) NOT in(SELECT date FROM deal_calendar WHERE isDealDay='N')) AS 迟到,
(SELECT COUNT(*) FROM sign_record WHERE signTime in(SELECT max(signTime) FROM sign_record WHERE empNO=ep AND CONCAT(YEAR(signTime),'-',MONTH(signTime))=months GROUP BY date(signTime)) AND DATE_FORMAT(signTime,"%H:%i:%s")<'17:30:00' AND DATE(signTime) NOT in(SELECT date FROM deal_calendar WHERE isDealDay='N')) AS 早退,
(SELECT COUNT(*) FROM (SELECT DATE(signTime) AS dt,empNO FROM sign_record WHERE signTime in(SELECT min(signTime) FROM sign_record GROUP BY date(signTime),empNO) AND DATE_FORMAT(signTime,"%H:%i:%s")>'08:00:00') t3
INNER JOIN
(SELECT DATE(signTime) AS dt,empNO FROM sign_record WHERE signTime in(SELECT max(signTime) FROM sign_record GROUP BY date(signTime),empNO) AND DATE_FORMAT(signTime,"%H:%i:%s")<'17:30:00') t4
ON 
t3.dt=t4.dt AND t3.empNO=t4.empNO
WHERE t3.empNO=ep AND CONCAT(YEAR(t3.dt),'-',MONTH(t3.dt))=months AND t3.dt NOT in(SELECT date FROM deal_calendar WHERE isDealDay='N')) AS 迟到加早退,
(SELECT COUNT(*) FROM deal_calendar WHERE date NOT in(SELECT DISTINCT CONCAT(YEAR(signTime),'-',MONTH(signTime),'-',DAY(signTime)) FROM sign_record WHERE CONCAT(YEAR(signTime),'-',MONTH(signTime))=months AND empNO=ep ) AND CONCAT(YEAR(date),'-',MONTH(date))=months AND isDealDay='y') AS 全天缺席
FROM employee t1
LEFT JOIN
sign_record t2
ON
t1.empNO=t2.empNO
WHERE dept=1
GROUP BY 1,3;
END

存储过程调用:

CALL check_work_proc(1);

测试结果:
图片说明

0
qq_36720114
德玛洗牙 回复September_Lhi: 哈哈,第二个写到一半有事被叫出去了就没写了
4 个月之前 回复
September_Lhi
September_Lhi 第二个怎么来着呢
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
考勤查询统计SQL脚本。
本文主要记录下平时工作中考勤统计中的SQL脚本,以便于后续翻阅,同时和大家分享一下,不足的地方还请大牛多多给与点评。  1.首先是查询某员工的考勤记录。可以根据年份,月份,或者时间段查询结果,同时也可以去掉人员筛选条件,查询多个人的考勤结果。以及计算出该员工的打卡是否正常。SQL语句如下所示:  SELECT 员工号,卡号,姓名,日期, '打卡记录' AS 考勤类型, ...
考勤统计情况SQL语句
select employeeId,convert(varchar(10),occurred_date,120) as 天数,sum(case when eventType=1 then 1 else 0 end ) as 出勤数,sum(case when eventType=2 then 1 else 0 end ) as 迟到数,sum(case when eventType=3 then
一个关于考勤统计的sql研究
     在这里,我们要做一个简单的员工考勤记录查询系统的后台数据库。业务需求如下所示:      1.统计每天来的最早、来的最晚、走的最早、走得最晚的人的姓名           1.1 统计每天来得最早的人的姓名和打卡时间             步骤1:从考勤信息表中查询出每天来得最早的人的上班打卡时间和人员编号      解决这个问题的时候本来考虑的是在考勤信息记录表中按...
MySQL 时间函数(答学生问:关于员工考勤查询)
今天有学生问个关于MySQL时间操作的问题,直接看图:  查询某日人员的出勤时间问题。 我们都知道,企业员工考勤使用打卡方式,每天会记录每个员工的多次打卡记录,最后取每个员工的每天: 上班时间:当日最早时间; 下班时间:当日最晚时间。 所以分析查询每个员工每日考勤记录,需要根据员工分组,当天时间、时间最小和最大,时间格式化等操作,下面举例模拟该问题: 学生表student  ...
sql 语句 按照某年某月某周查询每位学生或员工的作业提交次数或打卡记录数据统计
sql 语句 按照某年某月某周查询每位学生或员工的作业提交次数或打卡记录数据统计。 对考勤次数,提交信息考核统计很重要。
根据员工上下班的等级计算考勤率和迟到次数SQL语句
 select 1 as ManaulId,admin as UserId,2008-12-12 08:30:00 as SignTime,高手帮忙啊as SignDesc,10 as SignTaginto tb5insert into tb5 values(2,admin,2008-12-12 09:00:00, 急急,21)insert into tb5 va
用SQL server创建学生考勤管理系统
用SQL server创建学生考勤管理系统,这只是一个基础代码。
SQL中控考勤机自动打卡代码(详细)
SQL 中控考勤机 自动打卡程序(详细)
mysql导入打卡记录,查询员工每天最早上班时间和最晚下班时间
1、在数据库新建表card_records,根据打卡记录字段新建表的字段,新增id字段(自增) 2、利用navicat连接mysql数据库,导入打卡记录 右键新建的表,右键导入向导,选择导入的文件格式,我这里是excel2003,有时候mysql对excel2007不能正确打开,可以另存为excel2003 点击下一步,选择打卡记录所在的位置,以及数据在的sheet,我的数据
考勤sql语句
select name,CHECKTIME from USERINFO,CHECKINOUT where USERINFO.USERID = CHECKINOUT.USERID and CHECKTIME between '2018-11-30' and '2019-1-1' order by name asc ,CHECKTIME asc
考勤情况记录数据表、短信发送记录表设计
考勤管理数据表设计   1、刷卡记录表 字段 类型 约束 说明 work_id varchar(64) not null 工号 username varchar(64) not null 姓名 department varc
考勤系统的数据库分析
这个考勤系统的数据库,其实就是从打卡机里导出的所有员工的考勤信息,一个sheet里有三个员工的信息,具体如下: ,一位员工的信息可以看做是一个实体,所以还需要考勤表(包括某个人上班的天数,迟到的天数,旷工的天数。。。。),但是每个人又会有很多打开信息,就还需要个首先,容易分析出来的表:  员工表,考勤的详
公司考勤只需一条Sql语句
select E.name,CONVERT(varchar(10),WK.nowDate,111) as nowDay, min(dakaTime) as qiandaoTime, MAX(dakaTime) as qiantuiTime, case when min(dakaTime) > WK.workinTime and MIN(dakaTime)<DATEADD(HH,2,wk.wo
sql查询员工请假详情——请假天数跨月问题
项目中要加个月签到详情页面。需求:就是用户选择月份,查询该月员工签到详情(包括请假)。数据库(mysql)中已有休假表(tt_offwork),表结构如下:CREATE TABLE `tt_offwork` ( `offwork_id` varchar(32) NOT NULL, `create_time` datetime DEFAULT NULL, `day_num` decimal
SQL查询判断员工迟到
判断迟到 /****** Script for SelectTopNRows command from SSMS ******/ SELECT TOP (1000) [hid] ,[htbh] ,[uid] ,[startTime] ,[endTime] ,[Detail] ,[writeTime] FROM [ycfz
关于到今天考勤系统连续上班天数的问题或者连续登陆天数的问题(sql)
DateValue(打卡或者登陆日期),ITime(上班时间),OTime(下班时间),StaffID工号,EMPID为员工编号 一个很好的解题思路 找到最近没打卡或者上班记录的最近日期max(DateValue) select datediff(day,max(DateValue),getdate() ) as DateValue,StaffID from 考勤表 where DateVa
求sql考勤数据分析问题
<br />早上好,还是继续考勤问题,没做过真麻烦。<br />一,表:<br />1,刷卡记录表(考虑重复刷卡,上班取最后的,下班取最小的记录)<br />员工ID 刷卡时间<br />1 2010-05-24 07:56<br />1 2010-05-24 08:00<br />1 2010-05-24 12:00<br />1 2010-05-24 13:31<br />...<br />2 2010-05-24 07:56<br />2 2010-05-24 12:00<br />...<br />
MySQL 关联查询多一列统计出勤
 做考勤记录是碰到的,希望对有类似需求的同学一些参考  有一张标准出勤日历表规定用户该月应出勤天数   表一  用户出勤天数统计表   表二 怎样统计用户出勤异常天数呢。   查询数据多一列 关联条件判断 方式一                       SELECT  c.*, IF((SELECT id FROM tb_sign_record WHERE user_id=5 AND sign...
java员工考勤系统
公司实习所写的项目,可做毕设参考。包括员工登录,管理员根据权限选择前后台登录,意见管理,员工考勤,工资发放等。
C#winform sql数据库源码(员工考勤系统)
C# 源代码员工考勤管理系统,报表,Excel数据导出功能等
SQL统计人员考勤率和2019年双休天和节假日
因为要做一个人员考勤功能,因为是区间查询,只有开始时间和结束时间,要剔除节假日和双休日,而公司没有维护这些信息,网上找了下好像没有现成的,没办法只能用笨办法,花了个吧小时从百度日历里面统计了2019年的节假日情况。 初步校验了下,有问题请留言 https://pan.baidu.com/s/1yutjXK-w9fweGd710GXgVA ...
阶段3:手把手快速做一个Java swing mysql学生签到考勤系统附带完整源码及开发视频
本视频教程一共分为四个阶段,每个阶段都会是上一个阶段的扩展,每一个阶段的系统都可独立作为一个完整的系统。第一阶段是Java学生信息管理系统,没有看第一阶段的请移步第一阶段,地址是:http://programmer.ischoolbar.com/index.php/article/article/id/104.html 。第二阶段是学生选课系统,在第一阶段的基础上增加了选课管理功能,没有看第二阶段...
JSP MYSQL企业员工考勤管理系统
JSP MYSQL员工考勤管理系统 系统的主要功能包括:部门信息管理、员工管理、请假申请、请假审核、员工出勤管理等。分为管理员用户、员工用户、
关于考勤数据的思考(MySQL)
最近考勤系统老是出错,不知道公司考勤是怎么做的。因为自己对MySQL用的也不多,这里根据自己的想法参考了别人的博客,加上自己的验证。学到了一些收获,在这里记下来。 数据库索引 主键: 数据库innodb引擎支持不显式指定主键,但是会默认创建一个用户不可见的主键。 联合索引 联合索引可以是唯一索引,是多个key的联合。 on duplicate key 这是数据库插入时主键或者唯...
完整的Spring-boot实现(部门与员工)
完整的spring-boot实现 工具:jdk1.7  -- eclipse --  Maven  目的:实现通过部门ID查询部门及所有员工信息 目录结构: index.jsp <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> Insert
获取一个月的考勤数据
需求如下: 获取一个月内所有考勤数据, 但是考勤记录会缺失 , 例如 今天签到 昨天没有签到 , 数据库中就不存在昨天的打卡信息. 解决办法如下: 首先生成一个月初到月尾的数组,方法如下: /* * Effect 生成当月数组 * author FuJiHui * email 237813405@qq.com * time ...
考勤制造器V1.3.5 (考勤生成,考勤合成, 打卡记录生成,刷卡记录,刷卡数据,打卡生成,打卡合成)
根据用户现有ACCESS数据库中的员工信息,模拟真实情况,生成指定的打卡记录.可以指定产生随机时间的范围,可指定开始,结束日期.可设定节假日.要以选择加班时间,从周一到周五可以设定是否加晚班,周六日可以从上午,中午,晚上三个时间段进行选择. 运行此软件需要您的系统的安装了OFFICE软件. 注意: 1. 请正确设置"源数据库文件". 2. 数据表中员工的SecureID(识别ID)必须填写, 员工的LeaveDate(离职时间)必须足够晚才行, 不然没有数据. 记录生成规则如下: 1.对于所有用户,入职当天不产生打卡记录, 职离最后一天不产生打卡记录. 2.从周一到周五,默认生成上午和下午的打卡记录,另外可以在"选项"一栏中选择是否需要生成晚上加班打卡记录. 3.考虑到周六和周日加班的特殊性,可以对周六和周日分别设定是否生成上午打卡记录、下午打卡记录、和晚上打卡记录。 4.各打卡时间的随机数据范围,都可以通过程序界面进行设置. 5.产生打卡记录的开始日期和结束日期可以通过程序界面进行设置. 6.可设置节假日信息,包括边界值,比如10月1日到10月7日放假,表示1号,2号,3号,4号,5号,6号,7号都不产生打卡记录. 7.如果数据库中存放用户信息的表名或字段名发生变化,可通过界面进行设置. 8.如果数据库中存放打卡记录的表名或或字段名发生变化,可通过界面进行设置. 9.可指定源数据库文件和目的数据库文件的位置. 10.可以指定"一天只打两次卡", 选中后只生成一天当中第一次进厂和最后一次离厂的打卡记录. 11.可以指定"为每人生成一张新表", 选中后为每一位员工生成单独的打卡记录表, 表名由员工ID及员工名组成.
人事系统中如何根据打卡数据自动产生考勤记录
企业使用考勤机打卡后如何产生考勤记录呢? 需要考虑的参数: 1、应该打卡时间 2、实际打卡时间 3、重复打卡数据处理 4、周末假期与平时上班的不同处理 5、迟到、早退、矿工的时间设置 6、是否已经存在请假 7、加班的标准 处理流程 1、获取当日的班别,即获取当日的实际打卡时间、休息类型 2、获取当日的请假数据, 3、获取实际打卡数据,检测打卡数据是否完整(是否有漏打卡的、缺...
EF实现考勤管理---(MVC,签到签退)
考勤管理实现公司自动化管理,可以通过员工上班下班打卡时间判断员工工作时间,是否迟到。
基于jsp考勤管理系统
基于jsp的考勤管理系统,内附说明书,比较详细,是在别人的基础上弄得,希望分享
日历考勤记录
一个简单的日历考勤记录 项目中需要一个日历考勤功能,可以对员工的考勤,以一个直观的日历形式展示出来,比如绿色代表正常,黄色代表迟到,等。 下面的代码就是对此功能的一个简单实现,当然啦,代码还不完善,不过已经做到一个大致的展示,需要的小伙伴们可以根据自己的需求做相应的改动。 &amp;lt;!DOCTYPE HTML&amp;gt; &amp;lt;html lang=&quot;zh_CN&quot;&amp;gt; &amp;lt;head&amp;gt...
员工考勤系统
员工考勤系统(employee_work_system),提供三种数据库:mysql,oracle,sqlserver,对应三种框架源码:springMVC/spring+springMVC+hibernate/spring+springMVC+mybatis,开发工具是myeclipse,提供基本增删改查,后台分页,图片上传,附件上传,富文本编辑器,时间选择器等功能。
中控考勤打卡记录查询
PHP网页查询考勤记录,连接中控考勤系统SQLSERVER,用于公司考勤记录查询。这样公司任何人,只要打开网页就可以查询自己的考勤记录,有分上午,中午,晚上打卡时间。 注意修改PHP的max_execution_time 时间,查询全部内容时,会出现超时,可能我的算法有问题,但还是能得出结果。
基于JSP的学生考勤管理系统(MySQL版)
基于JSP的学生考勤管理系统(MySQL版) 1.包含源程序,数据库脚本。代码和数据库脚本都有详细注释。 2.课题设计仅供参考学习使用,可以在此基础上进行扩展完善。 开发环境: MyEclipse 8,MySLQ 5.0,JDK1.7,Tomcat 5.5 涉及技术点: MVC模式、JSP、JDBC、HTML、JavaScript、CSS、JQUERY、文件上传等 程序功能: 1.学生:请假申请、请假查看、考勤信息查看。 2.老师:请假审批、考勤管理、考勤统计查询。 2.管理员:请假管理、考勤管理、考勤统计查询、老师信息管理、学生信息管理、课程信息管理、系统设置。
记考勤功能的简单实现
    好久没有记录最近遇到的问题了,源于实在是有点忙。    好吧,废话不多说,正式开始。    考勤功能的实现,首先需要考虑到考勤人,考勤时间,以及考勤状态这些属性。说起来很简单,无非就是当用户点击考勤按钮之后,更改考勤状态,并复刻当前的时间到对应考勤人的表记录中。    目前我默认'0'为未打卡状态,'1'为打卡状态,则SQL语句如下所示:update table_kq set kqsj='...
Java+MySQL高校学生考勤系统
压缩包包括数据库文件和一系列文档,文档包括论文+数据库表设计+系统截图,完整可直接运行。
jsp+servlet考勤管理系统
这是花了两周 受别人委托做出来的一个jsp+servlet的考勤系统,里面的代码值得学习,里面用了登录拦截技术和bootstrap的前端 数据库附加上去就能用
考勤系统用例图 及 用例文档
“考勤系统”问题陈述 作为Acme公司的信息主管,您被委托开发一个新的考勤系统。新系统允许员工记录电子的考勤信息并自动产生员工的工资支付信息。 新系统运行在整个公司内部的每个员工的计算机上,考虑到安全和隐私方面的原因,每个员工只能访问和编辑自己的考勤信息和工资支付信息,但是项目经理可以查看和编辑本项目组内部所有员工的信息。 新系统将维护公司内部所有的员工信息(目前公司大约有5000多名员工)
spring+springmvc+mybatis搭建的一个考勤管理系统附带mysql数据库
spring+springmvc+mybatis搭建的一个考勤管理系统附带mysql数据库
python自动考勤脚本实现
转载请注明链接 环境:ubuntu14.04 + firefox60.0.2 + python3.4 之前使用xdotool模拟鼠标键盘实现自动登录打卡考勤,但是后来公司加了验证吗,所以此方案不再适用,改由python实现。具体代码如下: ##&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;font size = &amp;amp;amp;amp;amp;amp;amp;amp;amp;quot;4px&amp;amp;amp;amp;amp;amp;
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 数据库课程设计考勤 数据库课程设计考勤