sql case 嵌套

/*************************************************************************************************************/  
--计算非固定薪资人员加班小时  
/*************************************************************************************************************/  
CREATE Proc RecountWorkHourForDF  
@BeginDate varchar(10),  
@EndDate varchar(10)  
AS  
-------------先删除操作日期的加班记录------------------------------------------------  
delete from WorkHourDetail  
Where (CardDate between @BeginDate and @EndDate )  
      and (left(CDay,1)='D' or left(CDay,1)='F')  
 
insert into WorkHourDetail(ECode,CardDate,CDay,FactWorkHour)  
Select -- A.ECode,A.EName,A.Card1,A.Card2,A.addtime,B.BTIME,B.ETIME,CDay,a.CardDate,  
        A.ECode,A.CardDate,B.CDay,  
        Case when substring(CDay,2,1)='*' then  
------------------------------正常上班前打上班卡--------------------------------------                  
            case when (card1<=B.BTIME and card1>'12:00' )then  
                 case when (card2<B.SETIME and card2>'12:00') then  
                          case when (datediff(mi,B.BTIME,card2)%60)>=30 then  
                              cast((datediff(mi,B.BTIME,card2)/60) as varchar(2))+'.5'  
                          else  
                              cast((datediff(mi,B.BTIME,card2)/60) as varchar(2))+'.0'  
                          end  
                      when ((card2>=B.SETIME) and (card2<'24:00')  and (left(CDay,1)='F') ) then  
                          '4.0'  
                      when ((card2>=B.XBTIME) and (card2<B.ETIME)) then  
                          case when (datediff(mi,B.XBTIME,card2)%60)>=30 then  
                              cast(((datediff(mi,B.XBTIME,card2)+240)/60) as varchar(2))+'.5'  
                          else  
                              cast(((datediff(mi,B.XBTIME,card2)+240)/60) as varchar(2))+'.0'  
                          end  
                      when ((card2>=B.ETIME) and (card2<=B.BWorkTime)) then  
                          '8.0'  
                      when (card2>B.BWorkTime and card2<'12:00')then  
                          case when (datediff(mi,B.BWorkTime,card2)%60)>=30 then  
                              cast(((datediff(mi,B.BWorkTime,card2)+480)/60) as varchar(2))+'.5'  
                          else  
                              cast(((datediff(mi,B.BWorkTime,card2)+480)/60) as varchar(2))+'.0'  
                          end  
                 else  
                     '0.0'  
                 end  
-----------------------------上半天下班前打上班卡------------------------------------  
                 when ((card1>=B.BTIME) and (card1<B.SETIME ) ) then  
                     case when (card2<B.SETIME and card2>'12:00' ) then  
                         case when (datediff(mi,BeginCard,card2)%60)>=30 then  
                                  cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.5'  
                              else  
                                  cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.0'  
                              end  
                          when ((card2>=B.SETIME) and (card2<'24:00')) then  
                              case when (datediff(mi,BeginCard,B.SETIME)%60)>=30 then  
                                  cast((datediff(mi,BeginCard,B.SETIME)/60) as varchar(2))+'.5'  
                              else  
                                  cast((datediff(mi,BeginCard,B.SETIME)/60) as varchar(2))+'.0'  
                              end  
                          when ((card2>B.XBTIME) and (card2<B.ETIME) and (card2<'12:00')) then  
                              case when ((datediff(mi,BeginCard,B.SETIME)+datediff(mi,B.XBTIME,card2))%60)>=30 then  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+datediff(mi,B.XBTIME,card2))/60) as varchar(2))+'.5'  
                              else  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+datediff(mi,B.XBTIME,card2))/60) as varchar(2))+'.0'  
                              end  
                          when ((card2>=B.ETIME) and (card2<=B.BWorkTime)) then  
                              case when ((datediff(mi,BeginCard,B.SETIME)+240)%60)>=30 then  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+240)/60) as varchar(2))+'.5'  
                              else  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+240)/60) as varchar(2))+'.0'  
                              end  
                          when (card2>B.BWorkTime and card2<'12:00') then  
                              case when ((datediff(mi,BeginCard,B.SETIME)+240+datediff(mi,B.BWorkTime,card2))%60)>=30 then  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+240+datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.5'  
                              else  
                                  cast(((datediff(mi,BeginCard,B.SETIME)+240+datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.0'  
                              end                                              
                     else  
                         '0.0'  
                     end  
-----------------------------下半天上班前打上班卡------------------------------------  
                 when (card1>=B.SETIME and card1>'12:00') then  
                     case when ((card2>B.XBTIME) and (card2<B.ETIME)) then  
                              case when (datediff(mi,B.XBTIME,card2)%60)>=30 then  
                                  cast((datediff(mi,B.XBTIME,card2)/60) as varchar(2))+'.5'  
                              else  
                                  cast((datediff(mi,B.XBTIME,card2)/60) as varchar(2))+'.0'  
                              end                          
                          when ((card2>=B.ETIME) and (card2<=B.BWorkTime)) then  
                              '4.0'  
                          when (card2>B.BWorkTime and card2<'12:00') then  
                              case when ((240+datediff(mi,B.BWorkTime,card2))%60)>=30 then  
                                  cast(((240+datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.5'  
                              else  
                                  cast(((240+datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.0'  
                              end                                              
                     else  
                         '0.0'  
                     end  
-----------------------------下半天下班前打上班卡------------------------------------  
                 when (card1>=B.XBTIME and card1<B.ETIME and card1<'12:00') then  
                     case when (card2<B.ETIME) then  
                              case when (datediff(mi,BeginCard,card2)%60)>=30 then  
                                  cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.5'  
                              else  
                                  cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.0'  
                              end  
                          when ((card2>=B.ETIME) and (card2<=B.BWorkTime)) then  
                              case when (datediff(mi,BeginCard,B.ETIME)%60)>=30 then  
                                  cast((datediff(mi,BeginCard,B.ETIME)/60) as varchar(2))+'.5'  
                              else  
                                  cast((datediff(mi,BeginCard,B.ETIME)/60) as varchar(2))+'.0'  
                              end  
                          when (card2>B.BWorkTime and card2<'12:00') then  
                              case when ((datediff(mi,BeginCard,card2)-datediff(mi,B.ETIME,B.BWorkTime))%60)>=30 then  
                                  cast(((datediff(mi,BeginCard,card2)-datediff(mi,B.ETIME,B.BWorkTime))/60) as varchar(2))+'.5'  
                              else  
                                  cast(((datediff(mi,BeginCard,card2)-datediff(mi,B.ETIME,B.BWorkTime))/60) as varchar(2))+'.0'  
                              end                                              
                     else  
                  '0.0'  
                     end  
                 when (Card1>=B.ETIME and Card1<=B.BWorkTime) then  
                     case when (card2>B.BWorkTime) then  
                       case when (datediff(mi,B.BWorkTime,card2)%60)>=30 then  
                           cast((datediff(mi,B.BWorkTime,card2)/60) as varchar(2))+'.5'  
                       else  
                           cast((datediff(mi,B.BWorkTime,card2)/60) as varchar(2))+'.0'  
                       end                      
                     else  
                         '0.0'  
                     end  
                 when (Card1>B.BWorkTime) then  
                     case when (card2>Card1 and card2>B.BWorkTime) then  
                       case when (datediff(mi,BeginCard,card2)%60)>=30 then  
                           cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.5'  
                       else  
                           cast((datediff(mi,BeginCard,card2)/60) as varchar(2))+'.0'  
                       end                      
                     else  
                         '0.0'  
                     end  
 
                 else  
                     '0.0'  
                 end  
        else  
  case when ((datediff(mi,B.BWorkTime,card2)>=30) and card2<='12:00') then  
   case when ((datediff(mi,B.BWorkTime,card2))%60)>=30 then  
     cast(((datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.5'  
   else  
     cast(((datediff(mi,B.BWorkTime,card2))/60) as varchar(2))+'.0'  
   end      
  else  
    '0.0'  
  end  
        end FactWorkHour  
From CardRecord A,EmpClass B  
Where A.Ecode=B.WORKID and A.CardDate=B.PRODATE --AND A.Ecode in (Select Ecode From Emploees Where EMoneyFix=0)  
      and (A.CardDate between @BeginDate and @EndDate)  
      and (left(CDay,1)='D' or left(CDay,1)='F')  
--      and A.CardDate in ('2007-12-01','2007-12-02','2007-12-06','2007-12-08','2007-12-09')


GO

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值