日期:2014-05-18  浏览次数:20582 次

存储过程,循环插入、合并、插入,大家帮帮忙
打卡机子
表a1

员工id ,打卡日期, 打卡时间

0001 2011-10-15 7:55
0001 2011-10-15 11:55
0001 2011-10-15 13:55
0001 2011-10-15 17:55

0001 2011-10-16 7:56
0001 2011-10-16 11:59
0001 2011-10-16 13:58
0001 2011-10-16 17:50


OA表
员工id , 日期, 上午上班时间,上午下班时间,下午上班时间,下午下班时间

0001 2011-10-15 7:55 11:55 13:55 17:55
0001 2011-10-16 7:59 11:59 13:58 17:50

如果把打卡机中的a1数据,通过sql语句或者存储过程,变成oa表里的数据?
急需!!!

------解决方案--------------------
SQL code

declare @表a1 table 
(
员工id varchar(4),
打卡日期 VARCHAR(10),
打卡时间 VARCHAR(5)
)
insert into @表a1
select '0001','2011-10-15','07:55' union all
select '0001','2011-10-15','11:55' union all
select '0001','2011-10-15','13:55' union all
select '0001','2011-10-15','17:55' union all
select '0001','2011-10-16','07:56' union all
select '0001','2011-10-16','11:59' union all
select '0001','2011-10-16','13:58' union all
select '0001','2011-10-16','17:50'

declare @OA表 table 
(
    员工id varchar(4),
    日期 VARCHAR(10),
    上午上班时间 VARCHAR(5),
    上午下班时间 VARCHAR(5),
    下午上班时间 VARCHAR(5),
    下午下班时间 VARCHAR(5)
)

insert into @OA表
select 员工id,打卡日期,
max(case when rid=1 then 打卡时间 else '' end),
max(case when rid=2 then 打卡时间 else '' end),
max(case when rid=3 then 打卡时间 else '' end),
max(case when rid=4 then 打卡时间 else '' end)
from (select row_number() over (partition by 员工id,打卡日期 order by 打卡时间) as rid,* from @表a1 ) a group by 员工id,打卡日期

select * from @OA表
/*
员工id 日期         上午上班时间 上午下班时间 下午上班时间 下午下班时间
---- ---------- ------ ------ ------ ------
0001 2011-10-15 07:55  11:55  13:55  17:55
0001 2011-10-16 07:56  11:59  13:58  17:50
*/

------解决方案--------------------
SQL code

--你可以按时间段分段处理
declare @表a1 table 
(
员工id varchar(4),
打卡日期 VARCHAR(10),
打卡时间 VARCHAR(5)
)
insert into @表a1
select '0001','2011-10-15','07:55' union all
select '0001','2011-10-15','11:55' union all
select '0001','2011-10-15','13:55' union all
select '0001','2011-10-15','17:55' union all
select '0001','2011-10-16','07:56' union all
select '0001','2011-10-16','11:59' union all
select '0001','2011-10-16','13:58' union ALL

select '0001','2011-10-16','17:50' UNION ALL

select '0001','2011-10-17','07:50' UNION ALL
select '0001','2011-10-18','11:50' UNION ALL
select '0001','2011-10-19','14:40' UNION ALL
select '0001','2011-10-20','19:50' 

declare @OA表 table 
(
    员工id varchar(4),
    日期 VARCHAR(10),
    上午上班时间 VARCHAR(5),
    上午下班时间 VARCHAR(5),
    下午上班时间 VARCHAR(5),
    下午下班时间 VARCHAR(5)
)

insert into @OA表
select 员工id,打卡日期,
MAX(case when 打卡时间 BETWEEN '00:00' AND '09:00' THEN 打卡时间 ELSE '' END),
MAX(case when 打卡时间 BETWEEN '09:00' AND '12:00' THEN 打卡时间 ELSE '' END),
MAX(case when 打卡时间 BETWEEN '12:00' AND '16:00' THEN 打卡时间 ELSE '' END),
MAX(case when 打卡时间 BETWEEN '16:00' AND '23:00' THEN 打卡时间 ELSE '' END)
from @表a1 a group by 员工id,打卡日期

select * from @OA表
/*
员工id 日期         上午上班时间 上午下班时间 下午上班时间 下午下班时间
---- ---------- ------ ------ ------ ------
0001 2011-10-15 07:55  11:55  13:55  17:55
0001 2011-10-16 07:56  11:59  13:58  17:50
0001 2011-10-17 07:50                
0001 2011-10-18        11:50         
0001 2011-10-19               14:40  
0001 2011-10-20                      19:50
*/