------ 学习中,支持~ ------ 學習下 ------ ding^^^^^^^^^^^^^^^^ ------ 你是哪家公司啊,做HR软件,,我们也做HR软件的。 ------ 学习了 ------ SQL code--------------------SQL Server数据格式化工具------------------- --------------------------------------------------------------- -- DESIGNER :happycell188(喜喜) -- QQ :584738179 -- Development Tool :Microsoft Visual C++ 6.0 C Language -- FUNCTION :CONVERT DATA TO T-SQL --------------------------------------------------------------- -- Microsoft SQL Server 2005 -- Developer Edition on Microsoft Windows XP [版本 5.1.2600] --------------------------------------------------------------- ---------------------------------------------------------------
use test go if object_id('test.dbo.attendance') is not null drop table attendance -- 创建数据表 create table attendance ( name char(5), id int, time datetime, type char(20) ) go --插入测试数据 insert into attendance select '张三',59775623,'2010-04-01 07:23:37',null union all select '张三',59775623,'2010-04-01 07:50:21',null union all select '张三',59775623,'2010-04-01 18:20:22',null union all select '张三',59775623,'2010-04-01 18:50:53',null union all select '李四',59775624,'2010-04-01 07:00:06',null union all select '李四',59775624,'2010-04-01 18:00:12',null union all select '李四',59775624,'2010-04-02 08:20:32',null union all select '李四',59775624,'2010-04-02 17:00:22',null union all select '李四',59775624,'2010-04-02 18:18:08',null union all select '王五',59775625,'2010-04-01 08:02:06',null union all select '王五',59775625,'2010-04-01 18:00:12',null union all select '王五',59775625,'2010-04-02 07:20:32',null union all select '王五',59775625,'2010-04-02 12:35:22',null union all select '王五',59775625,'2010-04-02 18:18:08',null go --代码实现
-->更新数据 update attendance set type=t2.type from attendance t1 inner join ( select name,id,time=_time,type=case when time<='08:00' and idd=1 then '上班' when time>'08:00' and time<='12:00' and idd=1 then '迟到' when time<'12:00' and idd<>1 then '上班重复刷卡' when time>='13:00' and time<='17:30' and idd=1 then '早退' when time>'17:30' and idd=1 then '下班' when time>'13:00' and idd<>1 then '下班重复刷卡' when time>='12:00' and time<='13:00' then '乱刷卡' end from ( select name,id,_time=time,time=convert(varchar(5),time,8),type, idd=row_number()over(partition by convert(varchar(10),time,120),name order by time) from attendance where convert(varchar(5),time,8)<='12:00' union all select name,id,_time=time,time=convert(varchar(5),time,8),type, idd=row_number()over(partition by convert(varchar(10),time,120),name order by time) from attendance where convert(varchar(5),time,8)>='13:00' union all select name,id,_time=time,time=convert(varchar(5),time,8),type,idd=0 from attendance where convert(varchar(5),time,8)>='12:00' and convert(varchar(5),time,8)<='13:00' )t ) t2 on t1.id=t2.id and t1.time=t2.time
update attendance set type=t3.type from attendance tt inner join (select t1.name name, t1.time time, type=case when t2.type is not null then t2.type when t2.type is null and convert(varchar(10),t1.time,108)<'12:00' then '上班重复刷卡' when t2.type is null and convert(varchar(10),t1.time,108)>'13:00' then '下班重复刷卡' end from attendance t1 left join (select t.name,t.time,type=case when convert(varchar(10),t.time,108)<'08:00' and idd=1 then '上班' when convert(varchar(10),t.time,108)>'08:00' and idd=1 then '迟到' when convert(varchar(10),t.time,108)>'18:30' and idd=2 then '下班' when convert(varchar(10),t.time,108)<'18:30' and idd=2 then '早退' else '乱刷卡' end from (select name,min(time) as time,'1' idd from attendance where convert(varchar(10),time,108)<'12:00' group by name,convert(varchar(10),time,120) union all select name,max(time) as time,'2' idd from attendance where convert(varchar(10),time,108)>'13:00' group by name,convert(varchar(10),time,120) union all select name,time,'3' idd from attendance where convert(varchar(10),time,108)>='12:00' and convert(varchar(10),time,108)<='13:00') t) t2 on t1.name=t2.name and t1.time=t2.time) t3 on tt.name=t3.name and tt.time=t3.time ------ 下班时间改为了18:30,为了测试,17:30没有早退,2楼的答案有点出入 ------ 楼主,分太少了…… ------ 学习!路过,路过! ------ http://www.intik.cn ------ 这里发言,表示您接受了CSDN社区的用户行为准则。