sql计算两个时间月份之差


IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].GetMonth') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].GetMonth
GO
create function GetMonth (@stadate datetime,@enddate datetime) 
returns decimal(20,2) 
as 
 begin 
  --declare @stadate datetime,@enddate datetime 
  declare  @moths decimal(20,2) 
  declare  @day int 
  declare  @str  int; 
  --set  @stadate='2013-01-29'  
  --set @enddate='2013-10-15' 
  set @str = 0; 
  set @moths=0 
  set @day=datepart(DAY,@stadate) 
  --判断开始日期是不是月底 
  if( CONVERT(varchar(10),@stadate,120)!=CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-'+CONVERT(varchar(2),dbo.GetMonths(@stadate)))) 
  begin 
    select @str=1 
  end 
  --select dateadd(MONTH,+1,@stadate),dateadd(day,-1,dateadd(MONTH,+2,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01'))) 
  --select dateadd(day,-1,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-'+convert(varchar(2),@day))) 
  --select  dateadd(day,-1,dateadd(MONTH,+1,@stadate)) 
  --select dateadd(day,-2,dateadd(MONTH,+2,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01'))),dateadd(MONTH,+2,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01')) 
 
     if(@str=0)--如果是月底 
     begin 
    while(@stadate     begin 
    --  //取当前月1号加两个月减两天得到月末的后一天减两天 
    if(dateadd(day,-2,dateadd(MONTH,+2,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01')))<@enddate) 
    begin 
      set @stadate=dateadd(day,-2,dateadd(MONTH,+2,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01'))) 
      set  @moths=@moths+1      
    end 
    else 
    begin 
       BREAK; 
    end 
   end 
     end
     else 
     begin 
       while(@stadate<=dateadd(day,+1,@enddate)) 
       begin 
       --加一个月后是不是大于结束日期  @enddate=2014-03-01 
       if( dateadd(MONTH,+1,@stadate)<=dateadd(day,+1,@enddate))    
       begin   
       set @stadate=dateadd(MONTH,+1,@stadate) 
             --判断是不是月底 比如1-30加一个月 到2-28好 
       if(@stadate        begin 
         set @stadate=CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-'+convert(varchar(2),@day))   
         set  @moths=@moths+1
       end
       else if(@stadate=dateadd(day,-1,dateadd(MONTH,+1,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01')))) 
       begin
            set @stadate=dateadd(day,-1,dateadd(MONTH,+1,CONVERT(datetime, CONVERT(varchar(7),@stadate,120)+'-01'))) 
         set  @moths=@moths+1
       end    
           
       end   
       else   
       begin   
     BREAK;   
       end   
       end
     end 
        
      if(@str!=0)
      begin
         set @stadate=  dateadd(day,-1,@stadate)
      end
       else
      begin
         if(@moths>0)
        begin
        set @stadate=  dateadd(day,+1,@stadate)
        end
      end
     if(@stadate<@enddate) 
   begin 
     select @moths=@moths+(convert(decimal(20,2), DATEDIFF ( day ,@stadate ,@enddate )+1)/convert(decimal(20,2), dbo.GetMonths(@enddate))) 
   end  
  return @moths 
end 

你可能感兴趣的:(sql)