请教考勤刷卡5分钟内取一笔刷卡记录的功能。
我卡机下载到数据库中会有重复记录,如果是单台卡机,还能在卡机上设置功能,5分钟内不能重复刷卡。
但现在是有多台卡机,如果同时在多台卡机刷卡就会无法排除,都存到数据库中。这样员工的考勤就会很多的存在表中。
考勤表结构
ID FDATE FTIMEID是员工ID号,另外的分别是日期和时间。估计用SQL语句就能够排除多余的记录,如何写出语句能将所有员工5分钟内的记录只取一条?谢谢大家。
我卡机下载到数据库中会有重复记录,如果是单台卡机,还能在卡机上设置功能,5分钟内不能重复刷卡。
但现在是有多台卡机,如果同时在多台卡机刷卡就会无法排除,都存到数据库中。这样员工的考勤就会很多的存在表中。
考勤表结构
ID FDATE FTIMEID是员工ID号,另外的分别是日期和时间。估计用SQL语句就能够排除多余的记录,如何写出语句能将所有员工5分钟内的记录只取一条?谢谢大家。
select a.* from ta a
join ta b
on a.id=b.id and a.fdate=b.fdate and a.ftime<b.ftime and b.ftime-a.ftime<5-- 需要测试一下
from (select distinct id, fdate+ftime as date_time from ta) as a
where not exists (
select 1 from (select distinct id, fdate+ftime as date_time from ta) as b
where b.id=a.id
and datediff(minute, b.date_time, a.date_time) between 0 and 5
)
ALTER PROC P_DELETE_YSKQ
@KSRQ DATETIME,
@JSRQ DATETIME,
@MINUTE INT=5,
@KQJH BIT=0ASIF @KQJH=0
WHILE (
SELECT COUNT(*) FROM YSKQ A WHERE EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE) AND RQ BETWEEN @KSRQ AND @JSRQ
) > 1
BEGIN
DELETE A
FROM YSKQ A
WHERE EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE)
AND NOT EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE and sj>a.sj)
AND RQ BETWEEN @KSRQ AND @JSRQ
END
ELSE
WHILE (
SELECT COUNT(*) FROM YSKQ A WHERE EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE) AND RQ BETWEEN @KSRQ AND @JSRQ
) > 1
BEGIN
DELETE A
FROM YSKQ A
WHERE EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE)
AND NOT EXISTS
(select 1 from yskq where bh=a.bh and rq=a.rq and bc=a.bc and abs(datediff(mi,sj,a.sj)) between 1 and @MINUTE and sj>a.sj)
AND RQ BETWEEN @KSRQ AND @JSRQ
END
--以上是原始刷卡表,删除5分钟以内的重复数据,只保留第一条,机号不同不算重复。如有多次重复,需多次执行。
--如果机号不同也作重复,则去掉 and bc=a.bc 即可。
/*EXEC P_DELETE_YSKQ
@KSRQ='2009-05-29',
@JSRQ='2009-05-29',
@MINUTE=5,
@KQJH=0*/
@KQJH 是做什么控制的呀?
偶公司十几个班次,还有通宵卡<跨天>,薪资计法多种多样,很头痛,最怕维护和改规则
你好,你给的语句测试后
如果是17:20 17:22 17:25
他只会删除一笔记录,则保留下来的两笔有一笔仍是五分钟内多余的记录。这该如何处理呢?
考勤机号 啊。
用来表明此条数据来源于哪台考勤机。有时候我们只需要过滤掉同一台机器的X分钟内的数据,不同机器之间的重复数据不管。