精华内容
下载资源
问答
  • 考勤统计sql

    2012-10-12 16:13:55
    显示从1号到最后一天的所有人的考勤情况:1、y为正常;2、n为当天没有签到;3、超过8点签到的记录迟到分钟数; name 1 2 3 4 5 6 ... 31 张三 y n 15 n n n n 李四 n y n n n n n 王五 n n y 14 n n n
  • 日期 姓名 工号 类别 2012/8/2 张三 1 事假 2012/8/4 张三 1 病假 2012/8/4 李四 2 公假 日期 姓名 工号 工时 2012/8/1 李四 2 8 2012/8/2 李四 2 3.2 ...月考勤的效果 ...sql 语句怎样写
  • 前段时间做的一个OA系统,在考勤统计方面犯了难,现在已经完成项目,把考勤统计的数据库方面的查询代码给大家分享一下! ManualSign 考勤表 userinfo 员工表 departinfo 部门表 declare @starttime datetimedeclare ...

    前段时间做的一个OA系统,在考勤统计方面犯了难,现在已经完成项目,把考勤统计的数据库方面的查询代码给大家分享一下!

    ManualSign 考勤表 userinfo 员工表 departinfo 部门表

     

    declare @starttime datetime
    declare @endtime datetime
    set @starttime='2010-01-01 00:00:00' --开始统计的时间
    set @endtime='2010-07-07 00:00:00' --结束统计的时间

     

    declare @morningtime varchar(20)
    declare @afternoontime varchar(20)
    set @morningtime='08:00:00' --开始统计的时间
    set @afternoontime='18:00:00' --结束统计的时间

    declare @workdatenum int --总的工作日数


    select @workdatenum=(DATEPART(wk,@endtime)-DATEPART(wk,@starttime))*5 --相隔的周数
    +(case when DATEPART(dw,@endtime)=7 and DATEPART(dw,@endtime)=1 then 5 else DATEPART(dw,@endtime)-1 end)
    -(case when DATEPART(dw,@starttime)=7 and DATEPART(dw,@starttime)=1 then 5 else DATEPART(dw,@starttime)-1 end)
    --DATEPART(dw,@endtime)为1是星期日,2为星期一,3为星期二,4为星期三,5为星期四,6为星期五,7为星期6

    select distinct d.username as 姓名 , n.UserId as 用户名,
    cast((select cast(count(distinct convert(varchar(20),begintime,102)) as numeric(10,2))
    /cast(@workdatenum as numeric(10,2)) from ManualSign
    where   datepart(dw,begintime)>1 and datepart(dw,begintime)<7 and UserId=n.UserId and (begintime between @starttime and @endtime))as decimal(5,2)) as 考勤率,
    a.laternum as 迟到次数,b.earlynum as 早退次数,
    c.report as 旷工次数
    from ManualSign n
    left outer join
    (select UserId,count(*) as laternum from ManualSign where signinstate='迟到'
    and datepart(dw,begintime)>1 and datepart(dw,begintime)<7 and (begintime between @starttime and @endtime)
    group by UserId) a
    on a.UserId=n.UserId
    left outer join
    (select UserId,count(*) as earlynum from ManualSign where signonstate='早退'
    and datepart(dw,begintime)>1 and datepart(dw,begintime)<7 and (begintime between @starttime and @endtime)
    group by UserId) b
    on a.UserId=b.UserId
    left outer join
    (select UserId,@workdatenum-
    count(distinct convert(varchar(20),begintime,102)) as report from ManualSign
    where  datepart(dw,begintime)>1 and datepart(dw,begintime)<7 and (begintime between @starttime and @endtime)
    group by UserId) c
    on c.UserId=a.UserId
    right outer join
    userinfo as d on a.userid =d.userid
    left outer join departinfo as e on d.departid =e.departid

    转载于:https://www.cnblogs.com/caolibinjsy/archive/2010/07/28/1786718.html

    展开全文
  • 考勤查询统计SQL脚本。

    千次阅读 2018-11-27 08:43:06
    本文主要记录下平时工作中考勤统计中的SQL脚本,以便于后续翻阅,同时和大家分享一下,不足的地方还请大牛多多给与点评。  1.首先是查询某员工的考勤记录。可以根据年份,月份,或者时间段查询结果,同时也可以...

    本文主要记录下平时工作中考勤统计中的SQL脚本,以便于后续翻阅,同时和大家分享一下,不足的地方还请大牛多多给与点评。 

    1.首先是查询某员工的考勤记录。可以根据年份,月份,或者时间段查询结果,同时也可以去掉人员筛选条件,查询多个人的考勤结果。以及计算出该员工的打卡是否正常。SQL语句如下所示: 

    
    SELECT 员工号,卡号,姓名,日期,
           '打卡记录'  AS 考勤类型,
           Substring(日期, 1, 4)   AS 年份,
           Substring(日期, 6, 2)   AS 月份,
           Datename(weekday, 日期) AS 工作日类型,
           Min(打卡时间)             AS 上班打卡时间,
           Max(打卡时间)             AS 下班打卡时间,
           CASE
             WHEN Datename(weekday, 日期) <> '星期六'
                  AND Datename(weekday, 日期) <> '星期日' THEN( CASE
                                                             WHEN Min(打卡时间) = Max(打卡时间) THEN'上班或下班忘打卡'
                                                             WHEN Min(打卡时间) > '08:00:00' THEN '迟到'
                                                             WHEN Max(打卡时间) < '17:00:00' THEN '早退'
                                                             ELSE '正常'
                                                           END )
             ELSE '非工作日打卡'
           END                   AS 状态
    FROM   (SELECT a.[emp_id]                        员工号,
                   a.[card_id]                       卡号,
                   b.[emp_fname]                     姓名,
                   CONVERT(CHAR(10), sign_time, 120) 日期,
                   CONVERT(VARCHAR, sign_time, 108)  打卡时间,
                   [sign_time]
            FROM   [dbo].[TimeRecords] a
                   LEFT JOIN [dbo].[Employee] b
                          ON a.emp_id = b.emp_id
                             AND a.[card_id] = b.[card_id]
            WHERE  a.emp_id IS NOT NULL
                   AND a.emp_id <> ''
                   AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-09-01' AND '2018-10-30'
                   AND b.[emp_fname] = '姓名') AS mm
    GROUP  BY mm.员工号,
              卡号,
              姓名,
              mm.日期
    ORDER  BY 员工号,
              日期 ASC 
    
    

    查询结构如下所示:

    查询结果

    2.根据部门,员工姓名、日期查询员工的打卡记录:

    SELECT a.emp_fname,
           b.depart_name,
           CONVERT(CHAR(10), sign_time, 120)                    date,
           Min(c.sign_time)                                     AS BeginTime,
           Max(c.sign_time)                                     AS EndTime
    	   Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS minute,
    FROM   Employee a
           LEFT JOIN Departs b
                  ON a.depart_id = b.depart_id
           LEFT JOIN TimeRecords c
                  ON a.emp_id = c.emp_id
    WHERE  Substring(a.depart_id, 1, 3) = '041'
           AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'
           AND a.emp_id IS NOT NULL
    GROUP  BY depart_name,
              emp_fname,
              CONVERT(CHAR(10), sign_time, 120)
    ORDER  BY depart_name,
              emp_fname,
              CONVERT(CHAR(10), sign_time, 120) ASC

    查询结果如下所示:

    3.统计某一时间段内的员工的上下班打卡次数,以及迟到或早退30分钟以内的和30分钟以上的数据。

    SELECT a.emp_fname,
           b.depart_name,
           CONVERT(CHAR(10), sign_time, 120)                    date,
           Min(c.sign_time)                                     AS BeginTime,
           Max(c.sign_time)                                     AS EndTime
    	   Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS minute,
    FROM   Employee a
           LEFT JOIN Departs b
                  ON a.depart_id = b.depart_id
           LEFT JOIN TimeRecords c
                  ON a.emp_id = c.emp_id
    WHERE  Substring(a.depart_id, 1, 3) = '041'
           AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'
           AND a.emp_id IS NOT NULL
    GROUP  BY depart_name,
              emp_fname,
              CONVERT(CHAR(10), sign_time, 120)
    ORDER  BY depart_name,
              emp_fname,
              CONVERT(CHAR(10), sign_time, 120) ASC
    SELECT b.emp_fname,
           b.depart_name,
           Sum(CASE
                 WHEN ms = 0
                      AND CONVERT(CHAR(10), EndTime, 23) < '12:00:00' THEN 1
                 ELSE 0
               END) AS 上班未打卡,
           Sum(CASE
                 WHEN ms = 0
                      AND CONVERT(CHAR(10), EndTime, 23) > '12:00:00' THEN 1
                 ELSE 0
               END) AS 下班未打卡,
           Sum(CASE
                 WHEN 540 - ms BETWEEN 0 AND 30 THEN 1
                 ELSE 0
               END) AS 迟到或早退30分钟以内,
           Sum(CASE
                 WHEN 540 - ms > 30 THEN 1
                 ELSE 0
               END) AS 迟到或早退30分钟以上
    FROM   (SELECT TOP 100 PERCENT a.emp_fname,
                                   b.depart_name,
                                   Min(c.sign_time)                                     AS BeginTime,
                                   Max(c.sign_time)                                     AS EndTime,
                                   Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS ms
            FROM   Employee a
                   LEFT JOIN Departs b
                          ON a.depart_id = b.depart_id
                   LEFT JOIN TimeRecords c
                          ON a.emp_id = c.emp_id
            WHERE  Substring(a.depart_id, 1, 3) = '041'
                   AND CONVERT(CHAR(10), sign_time, 120) BETWEEN '2018-11-01' AND '2018-11-30'
                   AND a.emp_id IS NOT NULL
            GROUP  BY depart_name,
                      emp_fname,
                      CONVERT(CHAR(10), sign_time, 120)
            ORDER  BY depart_name,
                      emp_fname,
                      CONVERT(CHAR(10), sign_time, 120) ASC) AS b
    GROUP  BY emp_fname,
              depart_name
    ORDER  BY depart_name,
              emp_fname 

    查询结果如下: 

    4.统计各种假期的请假时长 :

    /****** Script for SelectTopNRows command from SSMS  ******/
    SELECT applyUser,
           ApplyDept,
           Sum(CASE
                 WHEN leavetype = '事假' THEN leaveHours
                 ELSE 0
               END) AS 事假,
           Sum(CASE
                 WHEN leavetype = '病假' THEN leaveHours
                 ELSE 0
               END) AS 病假,
           Sum(CASE
                 WHEN leavetype = '产检假' THEN leaveHours
                 ELSE 0
               END) AS 产前病事假,
           Sum(CASE
                 WHEN leavetype = '产假'
                       OR LeaveType = '陪产假' THEN leaveHours
                 ELSE 0
               END) AS 产假或护理假,
           Sum(CASE
                 WHEN leavetype = '婚假' THEN leaveHours
                 ELSE 0
               END) AS 婚假,
           Sum(CASE
                 WHEN leavetype = '丧假' THEN leaveHours
                 ELSE 0
               END) AS 丧假,
           Sum(CASE
                 WHEN leavetype = '年休假' THEN leaveHours
                 ELSE 0
               END) AS 年假,
           Sum(CASE
                 WHEN leavetype = '公假' THEN leaveHours
                 ELSE 0
               END) AS 公假,
           Sum(CASE
                 WHEN leavetype = '其他' THEN leaveHours
                 ELSE 0
               END) AS 其他,
           Sum(CASE
                 WHEN leavetype = '调休' THEN leaveHours
                 ELSE 0
               END) AS 调休,
           Sum(CASE
                 WHEN leavetype = '工伤假' THEN leaveHours
                 ELSE 0
               END) AS 工伤假
    FROM   HR_Leave
    WHERE  CompanyId = 16
           AND Node = 2
    	   AND CONVERT(CHAR(10), Start, 120) BETWEEN '2018-09-01' AND '2018-12-30'
    GROUP  BY ApplyDept,
              ApplyUserId,
              ApplyUser 
    

    SQL执行结果如下所示:

     5.根据加班类型,统计各种加班类型的加班时长:

    /****** Script for SelectTopNRows command from SSMS  ******/
    SELECT [ApplyUser],
           [ApplyDept],
           Sum(CASE
                 WHEN [OtType] = '平时延长' THEN Duration
                 ELSE 0
               END) AS 平时延长,
           Sum(CASE
                 WHEN [OtType] = '休息日' THEN Duration
                 ELSE 0
               END) AS 休息日,
           Sum(CASE
                 WHEN [OtType] = '法定节假日' THEN Duration
                 ELSE 0
               END) AS 法定节假日
    FROM   HR_Overtime
    WHERE  CompanyId = 16
           AND Node = 2
    	   AND CONVERT(CHAR(10), CreateDateTime, 120) BETWEEN '2018-09-01' AND '2018-12-30'
    GROUP  BY [ApplyDept],
              ApplyUserId,
              [ApplyUser] 
    

    查询结果如下所示:

     

    后续持续更新包含请假、加班、出差等相关联的综合查询。注:请假、出差、加班等流程在其他数据库中,几者关联查询不太想用DBLink,所以只有单独查询出来,在代码中用Linq做关联查询,关于跨数据库的关联查询,如果哪位老师有好的建议,欢迎留言。谢谢!

    展开全文
  • 要完成的效果是 数据库现在签到表有两种 1字段有(姓名,上午签到时间,上午签退,下午签到,下午签退) 2字段有(姓名,签到时间) 哪中好统计,如何设计好,该怎么统计, 谢了大家
  • --在有效打卡时间段内有多次打卡记录的,取第一次打卡记录,没有打卡记录或不在有效打卡记录时间段的不记考勤,标记NULL --求实现如下效果,CHECKTIME1和CHECKTIME2分别是有效打卡时间,双手奉上仅有的10分,求高手帮忙. ...
  • 得好好学学SQLsql写的好就是不一样!存储过程我记得以前写过的,但是现在怎么不会了!后面抽空得学回来! select personname, max(decode(Extract(day from kqrq), 1, property)) as day1,...

    学习了一阵才终于搞定了,借鉴了项目长韩强飞之前的,终于一次性提取出来显示了,比以前快了不知道多少倍呢!

    得好好学学SQL,sql写的好就是不一样!存储过程我记得以前写过的,但是现在怎么不会了!后面抽空得学回来!

    select personname,
                   max(decode(Extract(day from kqrq), 1, property)) as day1,
                   max(decode(Extract(day from kqrq), 2, property)) as day2,
                   max(decode(Extract(day from kqrq), 3, property)) as day3,
                   max(decode(Extract(day from kqrq), 4, property)) as day4,
                   max(decode(Extract(day from kqrq), 5, property)) as day5,
                   max(decode(Extract(day from kqrq), 6, property)) as day6,
                   max(decode(Extract(day from kqrq), 7, property)) as day7,
                   max(decode(Extract(day from kqrq), 8, property)) as day8,
                   max(decode(Extract(day from kqrq), 9, property)) as day9,
                   max(decode(Extract(day from kqrq), 10, property)) as day10,
                   max(decode(Extract(day from kqrq), 11, property)) as day11,
                   max(decode(Extract(day from kqrq), 12, property)) as day12,
                   max(decode(Extract(day from kqrq), 13, property)) as day13,
                   max(decode(Extract(day from kqrq), 14, property)) as day14,
                   max(decode(Extract(day from kqrq), 15, property)) as day15,
                   max(decode(Extract(day from kqrq), 16, property)) as day16,
                   max(decode(Extract(day from kqrq), 17, property)) as day17,
                   max(decode(Extract(day from kqrq), 18, property)) as day18,
                   max(decode(Extract(day from kqrq), 19, property)) as day19,
                   max(decode(Extract(day from kqrq), 20, property)) as day20,
                   max(decode(Extract(day from kqrq), 21, property)) as day21,
                   max(decode(Extract(day from kqrq), 22, property)) as day22,
                   max(decode(Extract(day from kqrq), 23, property)) as day23,
                   max(decode(Extract(day from kqrq), 24, property)) as day24,
                   max(decode(Extract(day from kqrq), 25, property)) as day25,
                   max(decode(Extract(day from kqrq), 26, property)) as day26,
                   max(decode(Extract(day from kqrq), 27, property)) as day27,
                   max(decode(Extract(day from kqrq), 28, property)) as day28,
                   max(decode(Extract(day from kqrq), 29, property)) as day29,
                   max(decode(Extract(day from kqrq), 30, property)) as day30,
                   max(decode(Extract(day from kqrq), 31, property)) as day31
              from (select personname, kqrq, property
                      from view_person_projAttend
                     where 1 = 1
                       and projid = '421440'
                       and kqrq BETWEEN to_date('2010-10-01', 'yyyy-MM-dd') AND
                           to_date('2010-10-31', 'yyyy-MM-dd'))
             group by personname

    转载于:https://www.cnblogs.com/yaojian/archive/2010/10/27/1862264.html

    展开全文
  • 考勤统计sql

    2012-05-22 11:23:24
    本人现在做很简单的考勤系统,数据采集是由指纹考勤机读取,存放到数据库表中 简单表结构如下: id varchar(30) 序列号 empno varchar(30) 员工号 checkTime dataTime 打卡时间 我如果要做统计每个员工日...
  • 在这里,我们要做一个简单的员工考勤记录查询系统的后台数据库。业务需求如下所示: 1.统计每天来的最早、来的最晚、走的最早、走得最晚的人的姓名 1.1 统计每天来得最早的人的姓名和打卡时间 步骤1:从考勤...

    在这里,我们要做一个简单的员工考勤记录查询系统的后台数据库。业务需求如下所示:

          1.统计每天来的最早、来的最晚、走的最早、走得最晚的人的姓名
               1.1 统计每天来得最早的人的姓名和打卡时间
                步骤1:从考勤信息表中查询出每天来得最早的人的上班打卡时间和人员编号
         解决这个问题的时候本来考虑的是在考勤信息记录表中按照日期对考勤信息进行分组,然后取每组中上班时间(att_work_datatime)的最小值,但是后来几经折腾发现group by只能实现分组,而order by只能实现组外排序,因此这个方法只能放弃。再三考虑了一下,可以在分组之前先对表中att_work_datatime列中的所有值进行升序排序后生成一个临时表,然后对这个临时表中的att_work_datatime按照日期再分组,这样对att_work_datatime列按照日期group by之后取的就是每天上班打卡最早的人,我们从attendance_info_table(考勤信息表)表中查询出出每天上班时间最早的人的编号、上班时间和下班时间,sql语句如下: 
              select tmp.att_work_datatime,tmp.after_work_datatime,tmp.emp_id 
              from
              (select id,att_work_datatime,after_work_datatime,emp_id
                    from attendance_info_table
                    order by att_work_datatime) as tmp
               group by Date(att_work_datatime)
              执行查询结果如下:
              
              结果并不如愿,发现多了一行null值,才发现分组的时候mysql默认将null分为一组,这样就多了一组null数据。这样我们只需要在排序之前过滤掉  打卡时间为null的数据行,sql语句如下:
                select tmp.att_work_datatime,tmp.after_work_datatime,tmp.emp_id
                from
               (select id,att_work_datatime,after_work_datatime,emp_id
                    from attendance_info_table
                     where att_work_datatime is not null
    order by att_work_datatime) as tmp
         group by Date(att_work_datatime)
         查询出来的结果如下图所示:
         
         步骤2:从员工表和考勤信息表中联结查询出每天来得最早的人的姓名上班打卡时间    
          这样,还没有满足需求,我们要打印的是每天来得最早的人的姓名和上班打卡时间,由于员工的信息在另外一张表employee_info_table中放着,这样我们需要用到多表联结查询,根据雇员编号进行等值联结查询,sql语句如下所示:
          select em.emp_name,tmp.att_work_datatime
         from employee_info_table as em ,
         (select id,att_work_datatime,after_work_datatime,emp_id
              from attendance_info_table
              where att_work_datatime is not null
              order by att_work_datatime )
         as tmp
         where em.id=tmp.emp_id
         group by Date(att_work_datatime)
     
    select eit.*, ait.att_work_datatime
    from attendance_info_table ait, employee_info_table eit
    where ait.emp_id = eit.id and ait.att_work_datatime in
         (select min(att_work_datatime)
           from attendance_info_table
            where att_work_datatime is not null
              group by Date(att_work_datatime))
    order by ait.att_work_datatime asc;
         查询出来的结果如下图所示:
         
         OK,大功告成。在这里要说明的是,为了缩短sql语句并且为了在一条sql语句中多次使用相同的表,上面的查询中我们使用em 作为员工信息表employee_info_table 的表别名,使用tmp作为排序后生成的临时表的表别名。
          1.2 统计每天来得最晚的人的姓名和打卡时间
         步骤和2.1中统计每天来的最早的人的方法相同,唯一不同的是分组之前先对表中att_work_datatime列中的所有值进行降序排序,sql语句如下:
          select em.emp_name,tmp.att_work_datatime 
         from employee_info_table as em ,
         (select id,att_work_datatime,after_work_datatime,emp_id
              from attendance_info_table
              where att_work_datatime is not null
              order by att_work_datatime desc)
         as tmp
         where em.id=tmp.emp_id
         group by Date(att_work_datatime)
     
    select eit.*, ait.att_work_datatime 
    from attendance_info_table ait, employee_info_table eit
    where ait.emp_id = eit.id and ait.att_work_datatime in
         (select max(att_work_datatime) 
         from attendance_info_table 
         where att_work_datatime is not null 
         group by Date(att_work_datatime))
    order by ait.att_work_datatime asc;
         执行查询的结果如下:
         
     
           1.3 统计每天走得最早的人的姓名和打卡时间
                 步骤和2.1中统计每天来的最早的人的方法相同,唯一不同的是对表中列中after_work_datatime的所有值进行升   序排序,并将查询的列由att_work_datatime改为after_work_datatime,sql语句如下:
               select em.emp_name,tmp.after_work_datatime 
              from employee_info_table as em ,
              (select id,att_work_datatime,after_work_datatime,emp_id
                   from attendance_info_table
                   where after_work_datatime is not null
                   order by after_work_datatime)
              as tmp
              where em.id=tmp.emp_id
              group by Date(after_work_datatime)
     
    select eit.*, ait.after_work_datatime 
    from attendance_info_table ait, employee_info_table eit
    where ait.emp_id = eit.id and ait.after_work_datatime in 
         (select min(after_work_datatime)
         from attendance_info_table
         where after_work_datatime is not null
         group by Date(after_work_datatime))
    order by ait.after_work_datatime asc;
         查询结果如下:
              
     
           1.4 统计每天走得最晚的人的姓名和打卡时间
               步骤和2.2中统计每天来的最晚的人的方法相同,唯一不同的是对表中列中after_work_datatime的所有值进行降序排序,并将查询的列由att_work_datatime改为after_work_datatime,sql语句如下:
          select em.emp_name,tmp.after_work_datatime 
         from employee_info_table as em ,
         (select id,att_work_datatime,after_work_datatime,emp_id
              from attendance_info_table
              where after_work_datatime is not null
              order by after_work_datatime desc)
         as tmp
         where em.id=tmp.emp_id
         group by Date(after_work_datatime)
     
    select eit.*, ait.after_work_datatime
    from attendance_info_table ait, employee_info_table eit
    where ait.emp_id = eit.id and ait.after_work_datatime in
         (select max(after_work_datatime)
         from attendance_info_table
         where after_work_datatime is not null
         group by Date(after_work_datatime))
    order by ait.after_work_datatime asc;
         查询结果如下:
         
      
         2.统计每天工作时间最长、工作时间最短的人的姓名
          2.1统计每天工作时间最长的人的姓名
              步骤1:从考勤信息表中查询出每天工作时间最长的人的编号和工作时长
              解决这个问题,我们需要建立在问题1解决方法的基础上,我们先取出考勤信息表中上班打卡时间att_work_datatime、下班打卡时          间after_work_datatime、上下班打卡时间之差作为一天的工作时长att_time以及员工编号emp_id生成一个临时表tmp并将打卡时间为null的数据过滤掉,然后对tmp表中的att_time进行降序排 序然后根据日期进行分组,这样我们就可以从attendance_info_table(考勤信息表)表中查询出每天工作时间最长的人的编号和此人的工作时长。为了计算两个时间差,我们使用mysql自带的函数timediff(time1,time2)来计算time1-time2的时长。sql语句如下:
                    select tmp.att_time,tmp.emp_id
                   from
                   (select id,att_work_datatime,after_work_datatime,timediff(after_work_datatime,att_work_datatime) as att_time,emp_id
                        from attendance_info_table
                        where att_work_datatime is not null and after_work_datatime is not null
                       order by att_time desc) as tmp
                     group by Date(att_work_datatime)
                      查询出的结果如下图所示:
                       
                    步骤2:从考勤信息表和员工表中利用等值联结查询出每天工作时间最长的人的姓名和工作时长
                   我们根据雇员编号进行等值联结查询出每天工作时间最长的人的姓名和工作时长,sql语句如下所示:
    select eit.*,tmp.att_time, tmp.att_work_datatime
    from employee_info_table eit,
         (select id,att_work_datatime,timediff(after_work_datatime,att_work_datatime) as att_time,emp_id
         from attendance_info_table
         where att_work_datatime is not null and after_work_datatime is not null) as tmp
    where eit.id=tmp.emp_id and tmp.att_time in
    (select max(timediff(after_work_datatime,att_work_datatime)) as att_time   
            from attendance_info_table
            where att_work_datatime is not null and after_work_datatime is not null
         group by date(att_work_datatime))
    group by date(tmp.att_work_datatime)
    order by att_work_datatime;
    执行出的结果如下图所示:
                
          2.2统计每天工作时间最短的人的姓名
    select eit.*,tmp.att_time, tmp.att_work_datatime
    from employee_info_table eit,
         (select id,att_work_datatime,timediff(after_work_datatime,att_work_datatime) as att_time,emp_id
         from attendance_info_table
         where att_work_datatime is not null and after_work_datatime is not null) as tmp
    where eit.id=tmp.emp_id and tmp.att_time in
    (select min(timediff(after_work_datatime,att_work_datatime)) as att_time    
            from attendance_info_table
            where att_work_datatime is not null and after_work_datatime is not null
         group by date(att_work_datatime))
    group by date(tmp.att_work_datatime)
    order by att_work_datatime;
              执行结果如下所示:
              
          3.统计每天迟到的人数、早退的人数
         3.1统计每天迟到的人数
    select date(att_work_datatime) as date,count(*)  as late_nums
    from attendance_info_table
    where timediff(time(att_work_datatime),'09:30:59') > 0 and att_work_datatime is not null
    group by date(att_work_datatime)
         执行结果如下图所示:
         
          3.2统计每天早退的人数
    select date(after_work_datatime) as date,count(*)  as leave_early_nums
    from attendance_info_table
    where after_work_datatime is not null
         and timediff(time(after_work_datatime),'18:00:00')<0
         or timediff(after_work_datatime,att_work_datatime)<'08:00:00'
    group by date(after_work_datatime)      
    执行结果如下图所示:
         
          4.统计每个月迟到的人按迟到次数降序排序
    select eit.*, count(*) as late_nums
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') > 0
         and ait.emp_id = eit.id   
    group by emp_id
    order by  late_nums desc;
              执行结果如下:
         
          5.统计出迟到的人并按姓名按升序排序,打印出迟到的时间
    select eit.*,timediff(time(ait.att_work_datatime),'09:30:59') as lately_times,date(ait.att_work_datatime) as lately_date
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') > 0
         and eit.id=ait.emp_id
    order by eit.emp_name asc;
    执行结果如下:
          6.公司规定:每迟到一次扣10块钱,每分钟扣1块钱,计算出每天迟到的人扣的钱和公司一天因为迟到扣的钱的总数
         6.1计算出每天迟到的人扣的钱
    select eit.*,timediff(time(ait.att_work_datatime),'09:30:59') as lately_times,date(ait.att_work_datatime) as lately_date,(10+1*(TIME_TO_SEC(timediff(time(ait.att_work_datatime),'09:30:59')))/60) as '罚金(元)'
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') > 0
         and eit.id=ait.emp_id
    order by eit.emp_name asc
    执行结果如下:
    6.1计算出公司每天因为迟到所扣的钱
    select tmp.lately_date,sum(tmp.fadefor)  as '总罚金(元)'
    from
         (select eit.*,timediff(time(ait.att_work_datatime),'09:30:59') as lately_times,date(ait.att_work_datatime) as lately_date,(10+1*(TIME_TO_SEC(timediff(time(ait.att_work_datatime),'09:30:59')))/60) as fadefor
         from attendance_info_table as ait,employee_info_table as eit
         where ait.att_work_datatime is not null
              and timediff(time(ait.att_work_datatime),'09:30:59') > 0
              and eit.id=ait.emp_id
         order by eit.emp_name asc) as tmp
    group by  tmp.lately_date
    执行结果如下:
          7.统计出每个月每个人因为迟到扣多少钱,按扣的钱数降序排序列出名单
         步骤一:统计出每个人每天迟到的时间并计算每个人每天的罚金
                    方法同6.1
             步骤二:根据人员编号进行分组,统计每个人每个月所扣的钱,并排序
    select tmp.id,tmp.emp_name,sum(tmp.fadefor) as 'total_fadefor' from
         (select eit.*,(10+1*(TIME_TO_SEC(timediff(time(ait.att_work_datatime),'09:30:59')))/60) as 'fadefor'
         from attendance_info_table as ait,employee_info_table as eit
         where ait.att_work_datatime is not null
              and timediff(time(ait.att_work_datatime),'09:30:59') > 0
              and eit.id=ait.emp_id) as tmp
    group by tmp.id
    order by total_fadefor desc;    
              
               查询结果如下:
              
       8.列举出既没有迟到也没有早退记录的人的名单
         步骤一:统计出每个人每个月正常出勤的天数
    select eit.*,count(*) as normal_nums
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and ait.after_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') < 0
         and timediff(after_work_datatime,att_work_datatime)>'08:00:00'
         and ait.emp_id = eit.id    
    group by ait.emp_id
     
    步骤2:查询出出勤次数大于指定天数的人的名单
    select tmp.id,tmp.emp_name from
    (select eit.*,count(*) as normal_nums
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and ait.after_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') < 0
         and timediff(after_work_datatime,att_work_datatime)>'08:00:00'
         and ait.emp_id = eit.id
    group by ait.emp_id
    )as tmp where tmp.normal_nums>=21 
    步骤三:通过获取一个月的天数,查询出一个月每天都正常出勤的人的名单
    select tmp.id,tmp.emp_name from
    (select eit.*,count(*) as normal_nums
    from attendance_info_table as ait,employee_info_table as eit
    where ait.att_work_datatime is not null
         and ait.after_work_datatime is not null
         and timediff(time(ait.att_work_datatime),'09:30:59') < 0
         and timediff(after_work_datatime,att_work_datatime)>'08:00:00'
         and ait.emp_id = eit.id
    group by ait.emp_id
    )as tmp
    where tmp.normal_nums>=
    (select count(*)
         from
         (select date(att_work_datatime)  as date
         from attendance_info_table
         where att_work_datatime is not null
         group by date(att_work_datatime)) as tmp)
    执行结果如下:

    转载于:https://www.cnblogs.com/caicaizi/p/8064799.html

    展开全文
  • 考勤系统统计sql问题

    2012-08-13 09:31:21
    checkInOut 打卡记录表 userId(关联userInfo表主键) checktime 打卡时间 1 2012-7-22 17:58:08 1 2012-7-23 17:38:36 1 2012-7-24 8:00:00 ...我想统计一下谁,迟到、早退、应到、矿工、请假的次数
  • 考勤统计情况SQL语句

    千次阅读 2006-01-21 09:34:00
    select employeeId,convert(varchar(10),occurred_date,120) as 天数,sum(case when eventType=1 then 1 else 0 end ) as 出勤数,sum(case when eventType=2 then 1 else 0 end ) as 迟到数,sum(case when eventType...
  • 最近在做考勤统计相关的报表,人事要求统计出每位员工每年的的调休和加班统计表。加班分为平时加班和周末加班,节假日加班由于算作工资,因此不统计。平时加班包含上年结余的和本年度的加班相加。然后,在计算出本...
  • [img=... [color=#FF0000]统计整月的出勤天数,早班天数,夜班天数,中班天数等。具体应该怎么实现?[/color] [img=https://img-bbs.csdn.net/upload/201806/05/1528178160_530935.jpg][/img]
  • 考勤类型checktype (按时上课、按时下课、迟到、早退、旷课、考勤时间) 考勤时间checkdate 根据这个表建立一个视图 视图名称:view_checkview 包含 姓名name 正常出勤normal 迟到later 早退 early 旷课 ...
  • 当月考勤统计

    2020-10-12 00:13:34
    记录一下考勤导出,需要的朋友可以借鉴,很多地方还不是很完善. 以下为导出的结果(都是假数据),后面很长没有截全 sql 表结构就不放了,可以做个参考 SELECT substr(date,1,7) date,`wname`,`name`,Code,iDCardNumber,...
  • 请假考勤统计系统软件,源码,会c#的可以修改使用,很简洁方便,给初学者一个很好地例子,呵呵,代码可以正常运行通过
  • SQL统计人员考勤率和2019年双休天和节假日-附件资源
  • sql 考勤

    千次阅读 2014-05-18 18:38:56
    在这里,我们要做一个简单的员工考勤记录查询系统的后台数据库。业务需求如下所示:  1.统计每天来的最早、来的最晚、走的最早、走得最晚的人的姓名  1.1 统计每天来得最早的人的姓名和打卡时间  步骤1:从...
  • 考勤sql语句

    千次阅读 2019-01-04 09:05:36
    select name,CHECKTIME from USERINFO,CHECKINOUT where USERINFO.USERID = CHECKINOUT.USERID and CHECKTIME between '2018-11-30' and '2019-1-1' order by name asc ,CHECKTIME asc
  • sql人事考勤管理系统

    2020-09-21 10:47:36
    一套不错的人事考勤管理软件,基于SQL SERVER 开发 实现 人事、信息管理。企业人事考勤管理系统,支持中控系列IC卡考勤机与彩屏指纹考勤机 功能模块:基础信息管理,人事信息管理,考勤信息,统计报表
  • 因为要做一个人员考勤功能,因为是区间查询,只有开始时间和结束时间,要剔除节假日和双休日,而公司没有维护这些信息,网上找了下好像没有现成的,没办法只能用笨办法,花了个吧小时从百度日历里面统计了2019年的节...
  • 每日考勤统计

    千次阅读 2011-03-04 17:27:00
    最近 一直在做公司的每日考勤这一块,用的是mysql 在写的时候遇到了不少的麻烦 其一在选取有效工作日时(attendance_time 存的是考勤数据,_atte_holidays 这里面存的是节假日的数据),我用了一条sql语句来查询 ...
  • 近期根据公司人事要求,写了一些关于考勤统计的报表。主要是查询员工每月的考勤数据,要求一行数据显示员工的当月的每天的考勤信息,标的样式如下: 然后,根据考勤表,写了如下SQL语句,来实现报表的查询,谨...
  • 考勤统计问题

    2015-12-16 23:37:02
    老东家就考勤管的严. 上午8:30上班 中午11:30签退,午休 下午13:30签到,开始工作 晚上18点下班. 中午签退的时间范围是 11:30至12点 下午签到的时间范围是 13:00至13:30 HR...
  • 想做一个每个人每天的统计考勤表, 包括学生学号,姓名,班级,联系方式,考勤状态,考勤日期 算法就是将每个人每天的考勤时间按升序排列,认为奇数次签到为上课签到,偶数次签到为下课时间, 如果下课时间-上课...
  • 我想统计出张三,李四,王五个人在7月份中,早餐,中餐,晚餐的考勤情况,其中重复打卡记录过滤,例如张三在7月1日早餐出现两次打卡只取一次,即得出下表: 姓名 早餐 中餐 晚餐 张三 2 2 2 李四 2 1 2 王五 2 2...
  • VC+Sql考勤管理系统

    2010-08-22 17:28:13
    Visual C++ + SQLServer 考勤管理,功能:加班、出入考勤、请假录入,旷工统计,假期设置,任意时间段考勤统计

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,428
精华内容 571
关键字:

考勤统计sql