日期:2014-05-17  浏览次数:20822 次

统计当前工作中的人数
一个表A记录了考勤数据,结构如下:

C# code

u_id            u_name         u_jc            u_datetime
-------------------------
1                张三          签入           2012-3-5 7:20:50
2                李四          签入           2012-3-5 7:21:20
3                王五          签入           2012-3-5 7:22:23
4                张三          签出           2012-3-5 12:1:12
......



数据有签入与签出,如何和当前时间对比统计出当前工作中的人数(即当前已签入并且未签出的人数),谢谢

------解决方案--------------------
SELECT count(distinct u_name) 
FROM tb
WHERE u_jc='签入';
------解决方案--------------------
查每个人的最后一条记录,如果是签出就说明在工作中

select count(1) from 
(select a.*,row_number()over(partition by a.u_name order by u_datetime desc) r from a)t
where t.r=1
and t.u_jc='签出'



------解决方案--------------------
怎么还在纠结时间对比,这个结果符合需求,逻辑没有问题,不需要再与时间对比了啊。

退一步,加上时间对比, 当前时间 > 签入时间,有意义吗?
查出来的都是历史记录,换句话说,肯定 当前时间 > (签入/签出)时间。

SQL code


-- 测试数据
  
  /*   u_id            u_name         u_jc            u_datetime
  -------------------------
  1                张三          签入           2012-3-5 7:20:50
  2                李四          签入           2012-3-5 7:21:20
  3                王五          签入           2012-3-5 7:22:23
  4                张三          签出           2012-3-5 12:1:12
  ......
  */

  with tmp as
  (                                 
    select 1 u_id ,'张三' u_name ,'签入' u_jc ,to_date('2012-3-5 7:20:50','YYYY-MM-DD HH24:MI:SS') u_datetime from dual union all
    select 2  ,'李四' ,'签入' ,to_date('2012-3-5 7:21:20','YYYY-MM-DD HH24:MI:SS') from dual union all
    select 3  ,'王五' ,'签入' ,to_date('2012-3-5 7:22:23','YYYY-MM-DD HH24:MI:SS') from dual union all
    select 4  ,'张三' ,'签出' ,to_date('2012-3-5 12:1:12','YYYY-MM-DD HH24:MI:SS') from dual
  )
  

-- 查询 SQL
   -- 找最后  = MAX(时间)的记录,再过滤 出签入的人 (最后记录 = 签出,认为 已结束收工,不在统计范围内)
  SELECT u_id,u_name,u_jc,u_datetime
         ,trunc(SYSDATE) - trunc(u_datetime) + 1 "工作天数"
        FROM tmp
      WHERE (u_name,u_datetime) IN
              (SELECT u_name,MAX(u_datetime) FROM tmp
                     GROUP BY u_name)
              AND u_jc = '签入'
          ;

------解决方案--------------------
不考虑其他情况,如迟到早退等等

select count(1) from tb a where u_jc='签入' and to_char(u_datetime,'yyyymmdd')=to_char(sysdate,'yyyymmdd')
and not exists(select 1 from tb where u_name=a.u_name and u_jc='签出' and to_char(u_datetime,'yyyymmdd')=to_char(a.u_datetime,'yyyymmdd'));