我要写一个触发器,根据求出两个时间的差来调整另一个表的一个时间字段,但是表的字段是timstemp类型,因为有多条记录,所以要将求出的多个时间差相加,请问,如何才能做到呢?要怎样转换为number类型?
原文如下:
create or replace trigger TUE_FAS_ATND_REC
  after insert on fas_atnd_rec  
  for each row
--declare numrows  INTEGER;
--        maxhours  INTEGER;
  -- local variables here
  
declare numrows  number;
        maxhours number;
  cursor attendanceCur is select * from FAS_ATND_REC where 
  to_char(FAS_ATND_REC.ATND_REC_WKR_OUT_DATE,'YYYY-MM-DD') = to_char(:old.ATND_REC_WKR_OUT_DATE,'YYYY-MM-DD');
  
pragma autonomous_transaction;   
begin
   for cur_result in attendanceCur loop 
      begin
      numrows:=numrows+to_number(to_char((cur_result.atnd_rec_wkr_out_date - cur_result.atnd_rec_wkr_in_date)));
      end ;
      end loop;
    select WKR_DLY_MAX_WORK_HOURS into maxHours from Fas_Wkr 
    where  WKER_PK = :old.ATRC_WKER_FK_IX01;
    if numrows > maxHours then 
     begin
        insert into FAS_WORK_HOUR_REC(FAS_WORK_HOUR_REC.WORK_HOUR_REC_DATE,FAS_WORK_HOUR_REC.WORK_HOUR_REC_VAL,FAS_WORK_HOUR_REC.WKHR_WKER_FK_IX01) 
        values(:old.ATND_REC_WKR_OUT_DATE,maxHours,:old.ATRC_WKER_FK_IX01);
     end;
    else
       begin
        insert into FAS_WORK_HOUR_REC(FAS_WORK_HOUR_REC.WKHR_PK,FAS_WORK_HOUR_REC.WORK_HOUR_REC_DATE,FAS_WORK_HOUR_REC.WORK_HOUR_REC_VAL,FAS_WORK_HOUR_REC.WKHR_WKER_FK_IX01) 
        values(SEQ_WORK_HOUR_REC_ID.NEXTVAL,:old.ATND_REC_WKR_OUT_DATE,numrows,:old.ATRC_WKER_FK_IX01);
       end;
    end if;
commit;   
  
end TU_FAS_ATND_REC;
其中的      numrows:=numrows+to_number(to_char((cur_result.atnd_rec_wkr_out_date - cur_result.atnd_rec_wkr_in_date)));
在触发后会提示不将char 转为number不成功,因为我要求的是小时之差hour放在numrows中,可能不是整数。请问有什么好办法解决吗,拜谢。

解决方案 »

  1.   

    numrows:=numrows+to_number(to_char((cur_result.atnd_rec_wkr_out_date - cur_result.atnd_rec_wkr_in_date)));
    改为: numrows:=numrows+round((cur_result.atnd_rec_wkr_out_date - cur_result.atnd_rec_wkr_in_date)*24,2);
      "to_char"是多余的,时间相减得出的就是数值型的,而且是以天为单位.
      

  2.   

    xiaohu1983000说得很对,把timestemp转为date类型直接相减就可以了,得到的就是number 类型
    myvalue := to_number(
          to_date(to_char(cur_result.atnd_rec_wkr_out_date,'yyyy-mm-dd hh:mi:ss'),'yyyy-mm-dd hh:mi:ss')
          -
          to_date(to_char(cur_result.atnd_rec_wkr_in_date,'yyyy-mm-dd hh:mi:ss'),'yyyy-mm-dd hh:mi:ss')
          );