SQL 连续七天未上班

人事系统经常需要统计考勤信息,如连续七天未上班、连续七天上班等,已知有刷卡记录表如下;

CREATE TABLE [dbo].[K07](
    [A0188] [int] NOT NULL,--人员id
    [K0700] [datetime] NOT NULL,--刷卡日期(只有日期)
    [K0701] [datetime] NOT NULL,--刷卡时间(时分秒)
}

连续七天未上班sql代码:

WITH    ks--按人分组查询刷卡日期和序号
          AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY k.a0188 ORDER BY k.a0188, k.k0700 ) sn ,
                        k.a0188 ,
                        k.k0700
               FROM     k07 k
               WHERE    k0700 BETWEEN '20130101' AND '20131231'
               GROUP BY k.a0188 ,
                        k0700
             )
             --两条序号相邻刷卡日期差值大于7
    SELECT  a.a0188 ,
            a.k0700 + 1 ksrq ,
            b.k0700 - 1 jsrq ,
            DATEDIFF(d, a.k0700, b.k0700) - 1 ts
    FROM    ks a ,
            ks b
    WHERE   a.a0188 = b.a0188
            AND b.sn - a.sn = 1
            AND DATEDIFF(d, a.k0700, b.k0700) > 7

连续七天上班sql代码:

WITH    ks
          --按人分组查询刷卡日期和序号
          AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY k.a0188 ORDER BY k.a0188, k.k0700 ) sn ,
                        k.a0188 ,
                        k.k0700
               FROM     k07 k
               WHERE    k0700 BETWEEN '20130101' AND '20131231'
               GROUP BY k.a0188 ,
                        k0700
             ),
        tj
          --计算刷卡日期和其序号差值,差值相同的刷卡日期连续
          AS ( SELECT   a0188 ,
                        k0700 ,
                        k0700 - sn diff ,
                        sn
               FROM     ks
             )
    SELECT  a0188 ,
            --diff ,
            MIN(k0700) ksrq ,
            MAX(k0700) jsrq ,
            COUNT(1) ts
    FROM    tj
    GROUP BY a0188 ,
            diff
    HAVING  COUNT(1) > 7
    ORDER BY a0188 ,
            diff
posted @ 2019-12-13 10:24  老余的水壶  阅读(453)  评论(0)    收藏  举报