请教考勤刷卡5分钟内取一笔刷卡记录的功能。
我卡机下载到数据库中会有重复记录,如果是单台卡机,还能在卡机上设置功能,5分钟内不能重复刷卡。
但现在是有多台卡机,如果同时在多台卡机刷卡就会无法排除,都存到数据库中。这样员工的考勤就会很多的存在表中。
考勤表结构
ID   FDATE   FTIMEID是员工ID号,另外的分别是日期和时间。估计用SQL语句就能够排除多余的记录,如何写出语句能将所有员工5分钟内的记录只取一条?谢谢大家。

解决方案 »

  1.   


    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-- 需要测试一下
      

  2.   

    select *
    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
      )
      

  3.   


    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*/
      

  4.   

    非常感谢你。
     @KQJH 是做什么控制的呀?
      

  5.   

    考勤比较复杂,不仅仅是5分钟内读卡的问题
    偶公司十几个班次,还有通宵卡<跨天>,薪资计法多种多样,很头痛,最怕维护和改规则
      

  6.   

    TO haochin
    你好,你给的语句测试后
    如果是17:20 17:22 17:25
    他只会删除一笔记录,则保留下来的两笔有一笔仍是五分钟内多余的记录。这该如何处理呢?
      

  7.   

    我的这个过程,当有多次重复的时候需要多次执行。。有三次重复就需要执行两次。你可以在这的基础上优化一下。@KQJH
    考勤机号 啊。
    用来表明此条数据来源于哪台考勤机。有时候我们只需要过滤掉同一台机器的X分钟内的数据,不同机器之间的重复数据不管。