老外用sql写的,供参考:
create table IncomeTable (
amt float,
d datetime
)
insert into IncomeTable values (-1000,'19980101')
insert into IncomeTable values (200,'19990101')
insert into IncomeTable values (200,'20000101')
insert into IncomeTable values (200,'20010101')
insert into IncomeTable values (200,'20020101')
insert into IncomeTable values (200,'20030101')
insert into IncomeTable values (200,'20040101')
go
create function irr(
@d datetime
) returns decimal(18,10) as begin
declare @irrPrev float set @irrPrev = 0
declare @irr float set @irr = 0.1
declare @pvPrev float
declare @pv float
set @pvPrev = (
select sum(amt)
from IncomeTable
)
set @pv = (
select sum(amt/power(1e0+@irr,cast(d-@d as float)/360e0))
from IncomeTable
)
while abs(@pv) >= 0.0001 begin
declare @t float
set @t = @irrPrev
set @irrPrev = @irr
set @irr = @irr + (@t-@irr)*@pv/(@pv-@pvPrev)
set @pvPrev = @pv
set @pv = (
select sum(amt/power(1e0+@irr,cast(d-@d as float)/365e0))
from IncomeTable
)
end
return @irr
end
go