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

着急!在线等待oracle存储过程翻译成sql server存储过程
原始数据
工作日期 员工编号 部门 员工姓名 上班时间 下班时间 实际上班时间 实际下班时间
2010-09-01 09140 总务课 丁亚伟 2010-09-0108:00:00 2010-09-01 17:30:00 2010-09-01 08:00:00 2010-09-01 17:30:00
2010-09-01 09140 总务课 丁亚伟 2010-09-01 07:00:00 2010-09-01 08:00:00 2010-09-01 06:45:41 2010-09-01 08:00:00
2010-09-01 09140 总务课 丁亚伟 2010-09-01 17:30:00 2010-09-01 21:00:00 2010-09-01 17:30:00 2010-09-01 21:04:21
2010-09-02 09140 总务课 丁亚伟 2010-09-02 08:00:00 2010-09-02 17:30:00 2010-09-02 08:00:00 2010-09-02 17:30:00
2010-09-02 09140 总务课 丁亚伟 2010-09-02 07:00:00 2010-09-02 08:00:00 2010-09-02 06:52:25 2010-09-02 08:00:00

最终要的结果

单位 工号 姓名 入厂日期 职位 开始日期 结束日期 连续出勤天数 可再延续出勤天数
管理部 09140 丁亚伟 2009-5-20 驾驶员 2010-9-1 2010-9-4 4 2
管理部 09140 丁亚伟 2009-5-20 驾驶员 2010-9-6 2010-9-11 6 0
管理部 09140 丁亚伟 2009-5-20 驾驶员 2010-9-13 2010-9-21 9 0
管理部 09140 丁亚伟 2009-5-20 驾驶员 2010-9-24 2010-9-27 4 2

现在已经得到数据有:
单位,工号,姓名,入厂日期,职位。
现在不会做的:
开始日期,结束日期,连续出勤天数,可再出勤天数 不会做:
其中:开始日期为每个月的1号或休假后的第一天
结束日期为每个月的最后一天或休假前一天
连续出勤天数为:结束日期-开始日期
可再出勤天数分两种情况:
1: 可再出勤天数<7天 提示:6-连续出勤天数;
2: 可再出勤天数>=7天 提示:0 


如下是oracle的存储过程代码,要翻译成sql server2000存储过程的代码,我对sql server2000存储过程不熟悉,想请大侠不吝赐教! 急要,谢谢

CREATE OR REPLACE
PROCEDURE INS_DUTY_TIME_REC_SEVEN IS
CURSOR C1 IS  
 select no
  from PERSONNEL_BASIC--人事基本数据table
  where area_code like :P_AREA 
  and resign_date is null
  and dl_idl = 'D'
  order by no;
v_num NUMBER:= 0;
v_num_2 NUMBER:= 0;
v_day NUMBER:= 0;
a_date date;
p_date varchar(15);
p_date_end varchar(15);
begin 
 --目前日期往前1天
 p_date := to_char(:P_RUN_DATE-1,'yyyymmdd') ;
 p_date_end := to_char(:P_RUN_DATE,'yyyymmdd') ;
 FOR c1_rec in c1 LOOP
  select count(*)
  into v_num
  from DUTY_TIME_REC--刷卡资料table
  where IN_OUT_TIME >=to_date(P_date||'06:00:00','yyyymmddhh24:mi:ss')--刷卡的时间范围
  and IN_OUT_TIME <= to_date(P_date_end||'05:59:59','yyyymmddhh24:mi:ss')
  and IN_OUT ='01'--上班卡
  and BADGE_NO = c1_rec.no
  and rownum=1;
  begin
  select count(DAYS),DAYS
  into v_num_2 ,v_day
  from DUTY_TIME_REC_SEVEN--连续记录table
  where BADGE_NO= c1_rec.no
  and FLAG='Y'
  group by DAYS;
  exception
  when others then
  v_num_2:=0;
  v_day:=0;
  end;
  if v_num>0 then
  if v_num_2>0 then
  update DUTY_TIME_REC_SEVEN
  set DAYS=DAYS+1,
  END_DATE=to_date(P_date,'yyyymmdd')
  where BADGE_NO= c1_rec.no
  and FLAG='Y' ;
  end if;
  if v_num_2 =0 then
  insert into DUTY_TIME_REC_SEVEN(BADGE_NO,DAYS,END_DATE,RUN_DATE,FLAG)
  values (c1_rec.no,1,to_date(P_date,'yyyymmdd'),:P_RUN_DATE,'Y');
  end if;
  end if;
  if v_num =0 then
  if v_day>=6 then
  update DUTY_TIME_REC_SEVEN
  set FLAG='N'
  where BADGE_NO= c1_rec.no
  and FLAG='Y';
  insert into DUTY_TIME_REC_SEVEN(BADGE_NO,DAYS,END_DATE,RUN_DATE,FLAG)
  values (c1_rec.no,0,to_date(P_date,'yyyymmdd'),:P_RUN_DATE,'Y');
  end if;
  if v_day<6 then
  update DUTY_TIME_REC_SEVEN
  set DAYS=0,
  FLAG='Y',
  RUN_DATE