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次上班下班
我现在要做的是就统计某月所有员工的迟到以及旷到(也就是没打卡)次数和其所对应的时间
表里的数据我都是分月取出来的(表里只有某月的打卡数据),也就是说可以不用判断时哪个月,就各位大虾指点一下思路!可以是数据库里做运算,程序做计算也行
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次上班下班
我现在要做的是就统计某月所有员工的迟到以及旷到(也就是没打卡)次数和其所对应的时间
表里的数据我都是分月取出来的(表里只有某月的打卡数据),也就是说可以不用判断时哪个月,就各位大虾指点一下思路!可以是数据库里做运算,程序做计算也行
SELECT 下班时间-CONVERT(MIN(DATE),'HH:mm:ss') FROM TB1 WHERE DATE=当天日期
要计算迟到和旷工,必须要有应上班和应下班时间,否则用什么规则来判断呢。
至于#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'
这就是迟到,
不上班的就不用说了,直接查标识
这样是不行的,因为如果我早上晚来10分钟,晚上晚回去10分这样也就等于没有迟到了,这个是不允许的,所以我说了一定要用固定的下班时间和最早的上班时间来比较,得出的时间才是你要的SELECT 员工名称,MIN(打卡时间) AS 打卡时间 FROM 表 WHERE 打卡日期=当天 AND DateAdd('h',8,MIN(打卡时间)) < 固定下班时间 GROUP BY 员工名称这样的话只会查出当天最早打卡时间到下班不足8小时的员工,也就是迟到的人
还有一个更简单的,在数据库里面加张表table1,里面只要放不间断的日期就行了,查询的时候用table1去left join你的考勤表,这样就不会少了。
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语句要如何写