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