试试吧,应该没问题,我花了近两个小时专门为你编写的
Table1为你设置的表(员工,基本工资,启用日期)
Table2是我建立的新表(年月,员工,基本工资),是为了保存员工某月的实际基本工资用的.
Usage: exec 算基本工资 '200201','2002-01-01','2002-01-31' (不用说明你都能明白的了)
CREATE PROCEDURE [算基本工资] (@month nvarchar(4) ,@date1 nvarchar(10),@date2 nvarchar(10))
AS
declare @no nvarchar(10),@gz money
declare @startdate datetime,@jbgz money
declare @days1 int, @days2 int
-- 先删除已经算号的基本工资,为重新计算做准备
delete from table2 where 年月=@month
declare 员工清单 cursor for select distinct 员工 from table1 order by 员工
open 员工清单
fetch next from 员工清单 into @no
while (@@fetch_status<>-1)
begin
select @gz=0
declare 基本工资变动表 SCROLL cursor for
select 启用日期,基本工资 from table1 where 员工=@no order by 启用日期 desc
open 基本工资变动表
fetch next from 基本工资变动表 into @startdate,@jbgz
while (@@fetch_status<>-1)
begin
if @startdate<@date1 -- 本月的开始日期小于此员工最近的基本工资设置日期
begin
select @gz=@jbgz
fetch last from 基本工资变动表 into @startdate,@jbgz
-- exit
end
if @startdate>@date2 ---- 本月的结束日期大于此员工最近的基本工资设置日期
begin
select @gz=0
end
if @startdate=@date1 ---- 本月的开始日期等于此员工最近的基本工资设置日期
begin
select @gz=@jbgz
fetch last from 基本工资变动表 into @startdate,@jbgz
-- exit
end
if ((@startdate>@date1) and (@startdate<=@date2)) ---- 此员工最近的基本工资设置日期落在本月日期范围内
begin
select @days1=DATEDIFF(DAY,@date1,@startdate)
select @days2=DATEDIFF(DAY,@startdate,@date2)
select @gz=@days1*round(@jbgz/30,2)
select @jbgz=基本工资 from table1
where 启用日期=(select max(t1.启用日期) from table1 t1 where t1.员工=@no and t1.启用日期<@startdate)
select @gz=@gz+@days2*round(@jbgz/30,2)
fetch last from 基本工资变动表 into @startdate,@jbgz
-- exit
end
fetch next from 基本工资变动表 into @startdate,@jbgz
end
close 基本工资变动表
deallocate 基本工资变动表
insert into table2(年月,员工,基本工资) values(@month,@no,@gz)
fetch next from 员工清单 into @no
end
close 员工清单
deallocate 员工清单