超难的SQL 语句.各位富翁们都来看看吧.(90)

  • 主题发起人 主题发起人 driayu
  • 开始时间 开始时间
D

driayu

Unregistered / Unconfirmed
GUEST, unregistred user!
我想从考勤打卡记录中,找出连续三次两个人的打卡时间相差不到1分钟的记录.一天的打卡记录有两万多条,每个人每天至少打4次卡.由于客户需求,要找出疑似代打卡的人员,一般来说,代打卡的人员,他们两个人的打卡时间相差都在1分钟以内,如果连续三次打卡时间相差在1分钟内,则作为怀疑代打卡对象.把这部分人员列出.考勤记录表的结构如下:KqRecord Autoid int identity(1,1) Primary key, Employeeid int, KqTime DateTime
 
应该是上班卡吧. 下班时1分钟内可能有几十人同时打的.这个只能是"怀疑代打卡". 还有些人是好朋友,一般都会在同时打卡.我也想知道这个SQL语句的写法.
 
上班卡与下班卡都要判断.
 
啊,装个摄像头呀,一看到代打卡就卡了他!
 
最简单的方法,在考勤资料中输入员工照片,然后在门卫放电脑,以刷卡就以消息形式显示照片,并报出名字,肯定不会出现你所说的情况了。
 
广是sql是无法处理的。请找高手了!
 
摄像头的方法我也想过,也正准备去做,我还想过去实现人脸识别.但目前只想通过判断打卡时间来解燃眉之急.
 
一天都没有答案,只好按笨方法去做了.
 
必须多加一个字段sq_id,记录打卡的时间段;例如上午上班sq_id=1,上午下班sq_id=2,下午上班sq_id=3,下午下班sq_id=4,第二天上午上班sq_id=5......数据太多,必须循环Employeeid insert into 临时表select distinct a.Employeeid, b.Employeeid from 考勤记录表 a, 考勤记录表 b where b.KqTime <= a.KqTime + 1分钟 and a.Employeeid <> b.Employeeid and a.sq_id = b.sq_id and a.sq_id = 1 and a.Employeeid = 999intersectselect distinct a.Employeeid, b.Employeeid from 考勤记录表 a, 考勤记录表 b where b.KqTime <= a.KqTime + 1分钟 and a.Employeeid <> b.Employeeid and a.sq_id = b.sq_id and a.sq_id = 2 and a.Employeeid = 999intersectselect distinct a.Employeeid, b.Employeeid from 考勤记录表 a, 考勤记录表 b where b.KqTime <= a.KqTime + 1分钟 and a.Employeeid <> b.Employeeid and a.sq_id = b.sq_id and a.sq_id = 3 and a.Employeeid = 999intersectselect distinct a.Employeeid, b.Employeeid from 考勤记录表 a, 考勤记录表 b where b.KqTime <= a.KqTime + 1分钟 and a.Employeeid <> b.Employeeid and a.sq_id = b.sq_id and a.sq_id = 4 and a.Employeeid = 999
 
采用指纹考勤机吧,这种用怀疑的态度搞,对员工的积极性有损.指纹考勤机要好点的,别弄巧成拙,都是识别不了,卡在那排队打卡:)
 
喜欢delphi的,进qq群delphi世界:23981160
 
我的想法,给每个人员一个固定长度的编号(字符型),一分钟之内的2个人,按小在前,大在后组合成一个新的字符(加上日期).然后统计该字符出现的次数即可.
 
也不一定用固定长度的编号,将ID变成字符型再处理一下就可以了。
 
“找出连续三次两个人的打卡时间相差不到1分钟的记录”这句怎么理解?是指一天中?还是指连续三天?如果不怕慢,有办法!我们用一天中连续三次的来举例:select Employeeid1,Employeeid2,count(*) from (select a.Employeeid Employeeid1, b.Employeeid Employeeid2, a.KqTime KqTime1, b.KqTime KqTime2from KqRecord a left join KqRecord b on a.KqTime >b.KqTime -1/24/60 and a.KqTime <b.KqTime +1/24/60 and a.Employeeid<>b.Employeeidwhere convert(varchar,a.KqTime,111)='2009/10/10')aa group by Employeeid1,Employeeid2 having count(*)>2语句应该可以简化,估计查询出来要几分钟。
 
如果大家都排队打卡的话,就有很多人打卡不到一分钟,都被列为疑似代打卡,还是采用指纹打卡机比较合适。select Employeeid1,Employeeid2,count(*) from (select a.Employeeid Employeeid1, b.Employeeid Employeeid2, a.KqTime KqTime1, b.KqTime KqTime2from KqRecord a left join KqRecord b on abs(datediff(mi,a.kqtime,b.kqtime))<1 and a.Employeeid<>b.Employeeid)aa group by Employeeid1,Employeeid2 having count(*)>2
 
后退
顶部