CHECKTIME         UserID  TYPE
2010-03-01 17:46:42.000 1         I
2010-03-01 17:46:51.000 2         I
2010-03-02 08:21:32.000 3         I
2010-03-02 08:21:44.000 4         O上面是我的表结构,是从打卡机里取出来的,TYPE值 I为上班 O为下班
员工可能会反复打卡,也就是说可能会有个人,在同一天打10次上班下班
我现在要做的是就统计某月所有员工的迟到以及旷到(也就是没打卡)次数和其所对应的时间
表里的数据我都是分月取出来的(表里只有某月的打卡数据),也就是说可以不用判断时哪个月,就各位大虾指点一下思路!可以是数据库里做运算,程序做计算也行

解决方案 »

  1.   

    下班如果是5点,那么你就用当天5点减去今天第一次打卡时间,小于8就是迟到只取最早打开的时间部分,然后用下班时间比如(05:00:00)去减得到的值小于8即迟到
    SELECT 下班时间-CONVERT(MIN(DATE),'HH:mm:ss') FROM TB1 WHERE DATE=当天日期
      

  2.   

    先group by userID,Convert(VARCHAR(10),CHECKTIME,120),再取max(CHECKTIME)和min(CHECKTIME)。这种方式只针对没有夜班的情况。
    要计算迟到和旷工,必须要有应上班和应下班时间,否则用什么规则来判断呢。
    至于#3楼说的,那是公务员的上下班出勤时间,对普通公司不管用。
      

  3.   

    这不就是一个按时间查询的问题,挺简单的啊
    比如上班时间为早8.30,下班是12点,在这区间打卡的都是迟到,那么你就可以写死前面部分的日期(都写1号吧)加上表里的时间部分,一比较就出来了
    2010-03-02 08:21:32.000 弄成 '2010-03-01 '+convert(char(20),CHECKTIME,114)>'2010-03-01 8:30' and '2010-03-01 '+convert(char(20),CHECKTIME,114)<'2010-03-01 12:00'
    这就是迟到,
    不上班的就不用说了,直接查标识
      

  4.   


    这样是不行的,因为如果我早上晚来10分钟,晚上晚回去10分这样也就等于没有迟到了,这个是不允许的,所以我说了一定要用固定的下班时间和最早的上班时间来比较,得出的时间才是你要的SELECT  员工名称,MIN(打卡时间) AS 打卡时间 FROM 表 WHERE 打卡日期=当天 AND DateAdd('h',8,MIN(打卡时间)) < 固定下班时间 GROUP BY 员工名称这样的话只会查出当天最早打卡时间到下班不足8小时的员工,也就是迟到的人
      

  5.   

    上面写错了,应该是在GROUP BY 里加上“打卡日期”注意是日期不是时间,也就是去掉时间部分
      

  6.   

    干吗每个循环都要去读数据库,在SQL里面用函数什么的都可以啊。
    还有一个更简单的,在数据库里面加张表table1,里面只要放不间断的日期就行了,查询的时候用table1去left join你的考勤表,这样就不会少了。
      

  7.   

    我建了一个时间表Left join过去,全部是双重复的记录,还是会有残缺我想了一个办法,日期可不用判断,因为我会在程序里判断日期如果当天有一个人打卡且不是双休就表示上班时间,现在我的问题是如何判断是否有人缺勤我有一个User表,
    UserName  UserID
    张三     1
    张械     2
    张要     3
    UserID 对应考勤里的 UserID我想给两个表做关联查询得到结果为
    UserName  UserID  CheckTime
    张三     1    2010-03-01 17:46:42.000
    张械     2    NULL
    张要     3    2010-03-01 17:46:42.000
    张三     1    2010-03-02 17:46:42.000
    张械     2    NULL
    张要     3    NULL
    也就是只要存在打卡记录的那天所有员工都要出一条记录,如果没有打卡就 CheckTime 为NULL不知道SQL语句要如何写