日期:2014-05-17  浏览次数:20535 次

一个变态的考勤难题(倒班+无上班、下班指示)
某公司电子考勤系统主要有两张表,一张《考勤记录表》,一张《刷卡记录表》。要实现统计迟到、早退和矿工
现在困难有两点:
1.公司是常白班和四班三运转制(0:00——8:00 夜班;8:00——16:00 白班;16:00——24:00 中班),上班时间必须提前15分钟刷卡,否则为迟到。下班必须在下班时间后刷卡,否则为早退。如果不迟到早退,则夜班和中班的上班刷卡和下班刷卡就跨越半夜12点了,而刷卡记录是按日存储的。
2.刷卡记录只是简单地记录了某人某天的刷卡记录(第一次刷卡时间和最后一次刷卡时间),并不知道上班、下班。而且还存在漏刷情况。

/***考勤记录表**/
ID 工号 姓名 日期 出勤
1 20013001 丁* 2013-09-01 休
2 20013002 高** 2013-09-01 常
3 20013003 张** 2013-09-01 夜
4 20013004 蔡** 2013-09-01 白
5 20013008 李** 2013-09-01 中
. ..... .... .......... ..

记录每日所有人应该的考勤记录,每人对应一个工号,此表由人工维护。
出勤定义为:
休——请假、出差、节假日、休息日等不需要上班的情况
常——常白班,7:45——17:00
夜——倒班夜班,先天23:45——8:00
白——倒班白班,7:45——16:00
中——倒班中班,15:45——24:00

/****刷卡记录表*******/
ID 工号 日期 刷卡1 刷卡2
1 20013002 2013-09-01 7:25 18:00 /*说明*/ 早上 7:25上班,晚上 18:00 下班
2 20013003 2013-09-01 8:15 23:36 /*说明*/上夜班 早上 8:15 下班,晚上 23:36上班
3 20013004 2013-09-01 7:55 16:01 /*说明*/ 早上 7:45上班,晚上 16:01 下班
4 20013008 2013-09-01 15:30 /*说明*/ 上中班 15:30 上班,无刷卡2表明第二天下班签退

刷卡记录表示日期当天的记录
对于倒班的来说,夜班、中班正常情况下(无迟到早退)签到在今天,签退则在次日
刷卡1、刷卡2 仅按时间显示当天第一次刷卡时间和最后一次刷卡时间,除了白班和常白班外不能对应上班、下班
存在漏刷情况:1、上班漏刷;2、下班漏刷;3、上下班都漏刷
若某天无某人无刷卡,则次日无该人记录。

考勤?电子?倒班

------解决方案--------------------
一定有很多规则要预先确定的,比如某人某天打一次卡,你当是上班还是下班卡?
有的跨天打卡,那么上班时间在一天,下班时间在第二天,这是很正常的

这是设计问题,也不是什么变态问题
------解决方案--------------------
考勤记录表如有人维护,对考勤系统并不是件难事,只要根据考勤记录表的员工班次+原始刷卡判断,
如果没有人工维护每天的班次,或者员工上班随意性很大,让系统智能根据刷卡分析出员工的班次,
难度增加N倍。
------解决方案--------------------
数据库就保存最简单的数据,谁在什么时间打了一次卡,
各种考勤的统计放到程序语言比如jsp、c#里面去做
写存储过程都可能会吃力不讨好
------解决方案--------------------
引用:
某人某天打一次卡,只能通过《考勤记录表》来倒退上下班刷卡:如果上班时间4小时以内按上班迟到,4小时后为早退


这个sql语句并难,最好你给出测试数据来

------解决方案--------------------
1. 还有一点你就是你表设计的问题,考勤表可以记录当天的标准上班时间,标准下班时间,第一次刷卡时间,第二次刷卡时间.

2. 如果上班时间刷卡两次,就以最后一次为主,如果下班时间刷卡两次,就以第一次为主,这样一条记录可以记下一个员工一天的刷卡记录.

3. 我觉得你的表结构应该这样
ID ,工号, 日期, 标准上班时间,标准下班时间,实际上班刷卡时间,实际下班刷卡时间,状态(是否出差\休息等)

4.  请不要用白,中,夜来替代标准上下班时间,如果哪天时间又改多了两个班,你又什么定义?


------解决方案--------------------
如果他们的考勤处理是用存储过程写的,估计你还能改一下,如果用前台开发工具写的,就没有办法改了。
优先找原供应商提供服务/升级软件。

------解决方案--------------------
佰思维吧,我有维护过他的产品,几百M的数据把服务器都拖跨,功夫了得
若要根本解决,自己重新设计和开发报表喽
------解决方案--------------------
有班次表和排班表,还好计算一点。
一天一个人的循环判断。
先读班次,再找相应的排班,查出应该的上班时间及下班时间,再在这两个时间点的前后2个小时查找打卡记录。找到后,再判断迟到、早退、漏打。
------解决方案--------------------
这是个巨难得问题,我们公司就实行电脑计算加人工审核,调整的方式,特别是工厂,不同的工种岗位规则都不一样,搞死人
------解决方案--------------------
www.onlyit.cn
上这个下个人力资源系统,里面考勤是可以自己写脚本程序控制的,很方便