日期:2014-05-17 浏览次数:20822 次
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 ......
-- 测试数据 /* 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'));