0

0

如何在mysql中设计员工考勤系统_mysql员工考勤项目实战

P粉602998670

P粉602998670

发布时间:2025-12-14 23:46:02

|

940人浏览过

|

来源于php中文网

原创

答案:设计MySQL员工考勤系统需构建员工表、打卡记录表、考勤规则表和每日汇总表,通过定时任务处理打卡数据并生成考勤结果。首先创建employees表存储员工信息;attendance_records表记录每次打卡时间;attendance_rules表配置上下班时间和容差规则;daily_attendance表存储每日考勤状态以提升查询效率。打卡数据通过SQL聚合提取每日首尾打卡时间,结合考勤规则判断迟到、早退等状态,并利用存储过程GenerateDailyAttendance按日更新汇总表。常用查询包括员工月度出勤统计和某日全体人员考勤情况展示,实现高效管理和分析。

如何在mysql中设计员工考勤系统_mysql员工考勤项目实战

设计一个MySQL员工考勤系统,关键在于合理的数据表结构、清晰的业务逻辑和高效的数据查询。下面从需求分析到数据库设计再到常用SQL操作,带你一步步完成一个实用的员工考勤系统。

1. 明确考勤系统的功能需求

一个基本的员工考勤系统通常需要支持以下功能:

  • 员工信息管理:记录员工编号、姓名、部门、职位等基本信息。
  • 打卡记录:记录每天上下班的打卡时间(支持多次打卡)。
  • 考勤规则配置:如上班时间、下班时间、迟到早退判断标准。
  • 考勤统计:按天/月统计出勤、迟到、早退、缺卡等情况。
  • 请假与异常处理:支持请假、补卡申请等人工干预。

基于这些需求,我们可以设计对应的数据库表结构。

2. 数据库表结构设计

以下是核心表的设计建议:

(1)员工表(employees)

CREATE TABLE employees (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    emp_name VARCHAR(50) NOT NULL,
    department VARCHAR(50),
    position VARCHAR(50),
    hire_date DATE,
    status TINYINT DEFAULT 1 COMMENT '1-在职, 0-离职'
);

(2)打卡记录表(attendance_records)

CREATE TABLE attendance_records (
    record_id BIGINT PRIMARY KEY AUTO_INCREMENT,
    emp_id INT NOT NULL,
    punch_time DATETIME NOT NULL,
    device_type VARCHAR(20) COMMENT '打卡方式: 手机, 门禁机等',
    FOREIGN KEY (emp_id) REFERENCES employees(emp_id)
);

(3)考勤规则表(attendance_rules)

CREATE TABLE attendance_rules (
    rule_id INT PRIMARY KEY AUTO_INCREMENT,
    work_date_type ENUM('weekday', 'weekend', 'holiday') DEFAULT 'weekday',
    start_time TIME DEFAULT '09:00:00',
    end_time TIME DEFAULT '18:00:00',
    late_tolerance INT DEFAULT 10 COMMENT '迟到容忍分钟数',
    early_leave_tolerance INT DEFAULT 10
);

(4)每日考勤汇总表(daily_attendance)

用于存储每日计算结果,提高查询效率。

通义听悟
通义听悟

阿里云通义听悟是聚焦音视频内容的工作学习AI助手,依托大模型,帮助用户记录、整理和分析音视频内容,体验用大模型做音视频笔记、整理会议记录。

下载
CREATE TABLE daily_attendance (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    emp_id INT NOT NULL,
    work_date DATE NOT NULL,
    clock_in TIME,
    clock_out TIME,
    status ENUM('正常', '迟到', '早退', '缺卡', '旷工') DEFAULT '正常',
    remarks VARCHAR(200),
    UNIQUE KEY unique_emp_date (emp_id, work_date)
);

3. 实现打卡数据处理逻辑

每次员工打卡,先插入到 attendance_records 表。然后通过定时任务或触发器,按日整理打卡记录,生成每日最早和最晚打卡时间。

示例:提取某员工某天的上下班时间

SELECT 
    emp_id,
    DATE(punch_time) AS work_date,
    MIN(TIME(punch_time)) AS first_punch,
    MAX(TIME(punch_time)) AS last_punch
FROM attendance_records 
WHERE emp_id = 1001 AND DATE(punch_time) = '2024-04-01'
GROUP BY emp_id, DATE(punch_time);

判断是否迟到(假设上班时间是09:00,容忍10分钟)

SELECT 
    emp_id,
    work_date,
    first_punch,
    CASE 
        WHEN first_punch > '09:10:00' THEN '迟到'
        ELSE '正常'
    END AS late_status
FROM (
    SELECT 
        emp_id,
        DATE(punch_time) AS work_date,
        MIN(TIME(punch_time)) AS first_punch
    FROM attendance_records 
    WHERE DATE(punch_time) = '2024-04-01'
    GROUP BY emp_id, DATE(punch_time)
) t;

4. 自动生成每日考勤汇总

可以写一个存储过程,每天凌晨运行,处理前一天的打卡数据并更新 daily_attendance 表。

简化版存储过程逻辑示意:

DELIMITER //
CREATE PROCEDURE GenerateDailyAttendance(IN target_date DATE)
BEGIN
    DECLARE done INT DEFAULT FALSE;
    DECLARE v_emp_id INT;
    DECLARE v_first_punch, v_last_punch TIME;
    DECLARE cur CURSOR FOR 
        SELECT emp_id, MIN(TIME(punch_time)), MAX(TIME(punch_time))
        FROM attendance_records 
        WHERE DATE(punch_time) = target_date
        GROUP BY emp_id;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
    FETCH cur INTO v_emp_id, v_first_punch, v_last_punch;
    IF done THEN LEAVE read_loop; END IF;

    -- 判断状态(简化)
    INSERT INTO daily_attendance (emp_id, work_date, clock_in, clock_out, status)
    VALUES (
        v_emp_id, 
        target_date, 
        v_first_punch, 
        v_last_punch,
        CASE 
            WHEN v_first_punch IS NULL THEN '旷工'
            WHEN v_first_punch > '09:10:00' THEN '迟到'
            WHEN v_last_punch < '17:50:00' THEN '早退'
            ELSE '正常'
        END
    ) ON DUPLICATE KEY UPDATE 
        clock_in = v_first_punch,
        clock_out = v_last_punch,
        status = CASE 
            WHEN v_first_punch IS NULL THEN '旷工'
            WHEN v_first_punch > '09:10:00' THEN '迟到'
            WHEN v_last_punch < '17:50:00' THEN '早退'
            ELSE '正常'
        END;
END LOOP;
CLOSE cur;

END// DELIMITER ;

5. 常用查询示例

查询某员工月度考勤统计

SELECT 
    status,
    COUNT(*) AS days
FROM daily_attendance 
WHERE emp_id = 1001 AND work_date BETWEEN '2024-04-01' AND '2024-04-30'
GROUP BY status;

查询所有员工某天的考勤情况

SELECT 
    e.emp_name,
    d.clock_in,
    d.clock_out,
    d.status
FROM daily_attendance d
JOIN employees e ON d.emp_id = e.emp_id
WHERE d.work_date = '2024-04-01';

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

683

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

323

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

348

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1096

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

358

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

697

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

575

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

418

2024.04.29

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 802人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号