人員考勤,MySQL數據庫一個表自動生成3表篩選人員遲到早退缺勤


前言:漂亮的人事小姐姐找我幫忙弄考勤:由於人員考勤和門禁一起,打卡記錄太多,打卡機只能導出一個打卡Excel總表,不容易人工篩選。

Excel表的格式是這樣的:(這里101代替真實人名)

實現目標:

8:30上班,5:30下班,可以導出工作日來公司人員遲到早退和沒來公司人員的缺勤情況表,這兩個結果表。
也可以導出每人每天最早打卡最晚打卡記錄表。

這個表需要導入MySQL數據庫進行篩選。遲到早退好判斷,其實這里最難判斷的是全天缺勤,因為打卡機沒有任何記錄。
需要自動生成人員表(把不打卡人去掉),上班日期表(把非工作日去掉),打卡表(每人每天最早最晚打卡)3個表聯查的。

1.先把Excel表格轉下格式(分列)

轉完后格式這樣了

 2.把表格導入MySQL數據庫

3.因為人員在變動,每回給的打卡表人員不會一模一樣,需要自動生成人員表(把不打卡人去掉),上班日期表(把非工作日去掉),打卡表(每人每天最早最晚打卡)3個表聯查的。-- -- 刪除不用打卡記錄人員

-- -- 刪除不用打卡記錄人員
DELETE FROM `考勤明細` WHERE `姓名` IN ('boss','張總','鍾總','吳總');
-- 
-- --創建上班日期表動態:超過一半人打卡加班算工作日:80是全體人員每天打卡次數,超過80代表上班日期,正常一天打卡110左右,周末單獨來公司開門打卡的人不會超過80次打卡
DROP TABLE if exists d;
CREATE TABLE d (SELECT `日期時間` FROM `考勤明細` WHERE (f5 <'08:30:00') OR (f5 >'17:30:00')  GROUP BY `日期時間` HAVING COUNT(`姓名`) > 80);
-- SELECT * FROM d;
-- 
-- -- 創建人員臨時表格
DROP TABLE if exists u;
CREATE  TABLE u (SELECT  `姓名` FROM `考勤明細` GROUP BY `姓名`);
-- SELECT * FROM u;
-- 
-- -- 創建考勤明細表
DROP TABLE if exists k;
CREATE TABLE k (SELECT * ,min(`f5`) as "最早打卡", max(`f5`) as "最晚打卡" FROM `考勤明細`   GROUP BY `姓名`,`日期時間`  ORDER BY `日期時間`,`姓名`); 
--  SELECT * FROM k ORDER BY `姓名`,`日期時間`;

-- 早上沒打卡-- -- 晚上沒打卡,這應該鏈接上班日期d表
SELECT `姓名`,`日期時間`,`f4` as '星期',`最早打卡`,`最晚打卡`,'遲到' FROM k WHERE `最早打卡` >'08:30:00' AND f4 !='星期日' AND f4 !='星期六'
UNION
SELECT `姓名`,`日期時間`,`f4` as '星期',`最早打卡`,`最晚打卡`,'早退' FROM k WHERE `最晚打卡` <'17:30:00' AND f4 !='星期日' AND f4 !='星期六' ORDER BY `姓名`,`日期時間`;

第2種寫法:
(SELECT k.`姓名`,k.`日期時間`,k.`f4` as '星期',k.`最早打卡`,k.`最晚打卡`,'遲到' FROM k RIGHT JOIN d on k.`日期時間` = d.`日期時間` WHERE k.`最早打卡` >'08:30:00')
UNION
(SELECT k.`姓名`,k.`日期時間`,k.`f4` as '星期',k.`最早打卡`,k.`最晚打卡`,'早退' FROM k RIGHT JOIN d on k.`日期時間` = d.`日期時間` WHERE `最晚打卡` <'17:30:00' )
ORDER BY `姓名`,`日期時間`;

-- -- 早上也沒打卡,晚上也沒打卡,但是來了(這個不用了,上面能查出來) -- SELECT * FROM t2 WHERE `最早打卡` >'08:30:00' AND `最晚打卡` <'17:30:00' AND f4 !='星期日' AND f4 !='星期六' GROUP BY `姓名`,`日期時間` -- -- SELECT k.*,'全天缺勤' from d INNER join u on 1=1 LEFT join k on u.`姓名`= k.`姓名` order by d.`日期時間`,k.`姓名`; -- select b.*,'全天缺勤' from k a right join (select * from u b,(select distinct `日期時間` from d) c) b on a.`姓名`=b.`姓名` and a.`日期時間`=b.`日期時間` WHERE a.`姓名` IS NULL --

  

結果如下

好了,可以給小姐姐了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM