select 打卡人, (case when 打卡时间 > '0900' then '迟到' else '' end), ... from T where 打卡日期 >= '20100501' and 打卡日期 <='20100531'
where 打卡日期 >= '20100501' and 打卡日期 <='20100531' 谢谢关注。我感觉这条语句感觉不太合适,比如说员工甲3月1号打卡,3月2号没打卡,3月三号打卡,查询结果不会显示2号旷工,只会显示没有记录。能不能实现1号--正常,2号旷工,3号迟到这样的结果
with mm as (select to_date(&mon||'01','YYYYMMDD')+ rownum-1 mday from dual connect by rownum <=31), yuangong as (select '员工1' yg from dual union all select '员工2' yg from dual union all select '员工3' yg from dual ), kaoqing as (select '员工1' yg,to_date('201001010812', 'YYYYMMDDHH24MISS') tt from dual union all select '员工1' yg,to_date('201001011612', 'YYYYMMDDHH24MISS') tt from dual union all select '员工2' yg,to_date('201001020712', 'YYYYMMDDHH24MISS') tt from dual ), my as ( select * from mm,yuangong where to_char(mday,'YYYYMM')= &mon), kqs as (select yg,to_date(to_char(tt,'YYYYMMDD'),'YYYYMMDD')mday,min(tt) mintt,max(tt)maxtt from kaoqing group by yg,to_char(tt,'YYYYMMDD')) select my.mday,my.yg, mintt,maxtt, case when mintt is null then '未打卡' when mintt >my.mday+8/24 and maxtt <my.mday+17/24 then '迟到早退' when mintt >my.mday+8/24 then '迟到' when maxtt <my.mday+17/24 then '早退' else null end from my,kqs where kqs.mday(+)=my.mday and kqs.yg(+)=my.yg
(case when 打卡时间 > '0900' then '迟到'
else ''
end),
...
from T
where 打卡日期 >= '20100501' and 打卡日期 <='20100531'
with
mm as (select to_date(&mon||'01','YYYYMMDD')+ rownum-1 mday from dual connect by rownum <=31),
yuangong as (select '员工1' yg from dual
union all
select '员工2' yg from dual
union all
select '员工3' yg from dual
),
kaoqing as (select '员工1' yg,to_date('201001010812', 'YYYYMMDDHH24MISS') tt from dual
union all
select '员工1' yg,to_date('201001011612', 'YYYYMMDDHH24MISS') tt from dual
union all
select '员工2' yg,to_date('201001020712', 'YYYYMMDDHH24MISS') tt from dual ),
my as ( select * from mm,yuangong where to_char(mday,'YYYYMM')= &mon),
kqs as (select yg,to_date(to_char(tt,'YYYYMMDD'),'YYYYMMDD')mday,min(tt) mintt,max(tt)maxtt from kaoqing group by yg,to_char(tt,'YYYYMMDD'))
select my.mday,my.yg, mintt,maxtt,
case when mintt is null then '未打卡'
when mintt >my.mday+8/24 and maxtt <my.mday+17/24 then '迟到早退'
when mintt >my.mday+8/24 then '迟到'
when maxtt <my.mday+17/24 then '早退'
else null
end
from my,kqs
where kqs.mday(+)=my.mday
and kqs.yg(+)=my.yg
有点儿意思,就是说在内存里建一个一个月每一天的resultset?
结果如下2010-1-1 员工1 2010-1-1 8:12:00 2010-1-1 16:12:00 迟到早退
2010-1-1 员工2 未打卡
2010-1-1 员工3 未打卡
2010-1-2 员工1 未打卡
2010-1-2 员工2 2010-1-2 7:12:00 2010-1-2 7:12:00 早退
2010-1-2 员工3 未打卡
2010-1-3 员工1 未打卡
2010-1-3 员工2 未打卡
2010-1-3 员工3 未打卡
2010-1-4 员工1 未打卡
2010-1-4 员工2 未打卡
2010-1-4 员工3 未打卡
2010-1-5 员工1 未打卡
2010-1-5 员工2 未打卡
2010-1-5 员工3 未打卡
2010-1-6 员工1 未打卡
2010-1-6 员工2 未打卡
2010-1-6 员工3 未打卡
2010-1-7 员工1 未打卡
2010-1-7 员工2 未打卡
2010-1-7 员工3 未打卡
2010-1-8 员工1 未打卡
2010-1-8 员工2 未打卡
2010-1-8 员工3 未打卡
2010-1-9 员工1 未打卡
2010-1-9 员工2 未打卡
2010-1-9 员工3 未打卡
2010-1-10 员工1 未打卡
2010-1-10 员工2 未打卡
2010-1-10 员工3 未打卡
2010-1-11 员工1 未打卡
2010-1-11 员工2 未打卡
2010-1-11 员工3 未打卡
2010-1-12 员工1 未打卡
2010-1-12 员工2 未打卡
2010-1-12 员工3 未打卡
2010-1-13 员工1 未打卡
2010-1-13 员工2 未打卡
2010-1-13 员工3 未打卡
2010-1-14 员工1 未打卡
2010-1-14 员工2 未打卡
2010-1-14 员工3 未打卡
2010-1-15 员工1 未打卡
2010-1-15 员工2 未打卡
2010-1-15 员工3 未打卡
2010-1-16 员工1 未打卡
2010-1-16 员工2 未打卡
2010-1-16 员工3 未打卡
2010-1-17 员工1 未打卡
2010-1-17 员工2 未打卡
2010-1-17 员工3 未打卡
2010-1-18 员工1 未打卡
2010-1-18 员工2 未打卡
2010-1-18 员工3 未打卡
2010-1-19 员工1 未打卡
2010-1-19 员工2 未打卡
2010-1-19 员工3 未打卡
2010-1-20 员工1 未打卡
2010-1-20 员工2 未打卡
2010-1-20 员工3 未打卡
2010-1-21 员工1 未打卡
2010-1-21 员工2 未打卡
2010-1-21 员工3 未打卡
2010-1-22 员工1 未打卡
2010-1-22 员工2 未打卡
2010-1-22 员工3 未打卡
2010-1-23 员工1 未打卡
2010-1-23 员工2 未打卡
2010-1-23 员工3 未打卡
2010-1-24 员工1 未打卡
2010-1-24 员工2 未打卡
2010-1-24 员工3 未打卡
2010-1-25 员工1 未打卡
2010-1-25 员工2 未打卡
2010-1-25 员工3 未打卡
2010-1-26 员工1 未打卡
2010-1-26 员工2 未打卡
2010-1-26 员工3 未打卡
2010-1-27 员工1 未打卡
2010-1-27 员工2 未打卡
2010-1-27 员工3 未打卡
2010-1-28 员工1 未打卡
2010-1-28 员工2 未打卡
2010-1-28 员工3 未打卡
2010-1-29 员工1 未打卡
2010-1-29 员工2 未打卡
2010-1-29 员工3 未打卡
2010-1-30 员工1 未打卡
2010-1-30 员工2 未打卡
2010-1-30 员工3 未打卡
2010-1-31 员工1 未打卡
2010-1-31 员工2 未打卡
2010-1-31 员工3 未打卡
查询当前月的所有天数
select * from
(
select (trunc(sysdate,'mm')+level-1) as dt from dual
connect by rownum<=35
)
where trunc(sysdate,'mm')=trunc(dt,'mm');