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

复杂的插入操作的存储过程
各位朋友,分别有表1和表2,表1的结构如下
员工编号          刷卡时间
CA001         2007-7-1 07:30
HA001  2007-7-1 08:30
ZA001  2007-7-1 09:30
CA001  2007-7-1 18:30
ZA001  2007-7-1 20:30
HA001  2007-7-2 07:30
KA001  2007-7-2 18:30
。。。。。  。。。。。。。。。。。。。。

表2的结构如下:
员工编号  上班  下班  刷卡时间


想做这样一个存储过程,假如用户输入起始时间和结束时间,然后就可以将表1里面对应时间段的记录插入到表2,例如起始时间为2007-7-1,结束时间为:2007-7-2,根据表1的刷卡记录要求生成表2以下的记录:
 
员工编号    上班      下班              日期
CA001             07:30       18:30               2007-7-1
HA001             08:30       空值                 2007-7-1
ZA001             09:30       20:30               2007-7-1
HA001             07:30       空值                 2007-7-2
KA001             空值         18:30               2007-7-2

提示:如果该员工当天只刷了一次卡,0:00至12:00时间就插入到上班1,12:00至23:59的时间就插入到下班,请问这样的存储过程可以有机会实现吗?如果可以,诚心请各位朋友赐教,谢谢!!!


------解决方案--------------------
create table tab(员工编号 varchar(10),刷卡时间 datetime)
insert tab
select 'CA001 ', '2007-7-1 07:30 '
union select 'HA001 ', '2007-7-1 08:30 '
union select 'ZA001 ', '2007-7-1 09:30 '
union select 'CA001 ', '2007-7-1 18:30 '
union select 'ZA001 ', '2007-7-1 20:30 '
union select 'HA001 ', '2007-7-2 07:30 '
union select 'KA001 ', '2007-7-2 18:30 '

CREATE TABLE TAB2(员工编号 VARCHAR(10),上班 datetime,下班 datetime,刷卡时间 datetime)

go


create proc p_insert_time
@start_time datetime,
@end_time datetime
as

insert TAB2(员工编号,上班,下班,刷卡时间)
select 员工编号,
up =case when right(convert(char(16),min(刷卡时间),120),5) between '00:00 ' and '12:00 ' then right(convert(char(16),min(刷卡时间),120),5) else null end ,
down=case when right(convert(char(16),max(刷卡时间),120),5) between '12:00 ' and '23:59 ' then right(convert(char(16),max(刷卡时间),120),5) else null end ,
convert(char(10),刷卡时间,120)
from tab
where convert(char(10),刷卡时间,120)> =@start_time and convert(char(10),刷卡时间,120) <=@end_time
group by 员工编号,convert(char(10),刷卡时间,120)

go

exec p_insert_time '2007-7-1 ', '2007-7-2 '
go
select * from tab2

go
drop proc p_insert_time
drop table tab,tab2


/* 结果

员工编号 上班 下班 刷卡时间
---------- ------------------------------------------------------ ------------------------------------------------------ ------------------------------------------------------
CA001 1900-01-01 07:30:00.000 1900-01-01 18:30:00.000 2007-07-01 00:00:00.000
HA001 1900-01-01 08:30:00.000 NULL 2007-07-01 00:00:00.000
ZA001 1900-01-01 09:30:00.000 1900-01-01 20:30:00.000