读书人

在Postgres自定义函数中兑现财务折旧金

发布时间: 2012-10-25 10:58:57 作者: rapoo

在Postgres自定义函数中实现财务折旧金额的计算

-- Function: db(float8, float8, float8, float8, float8) -- DROP FUNCTION db(float8, float8, float8, float8, float8); CREATE OR REPLACE FUNCTION db(float8, float8, float8, float8, float8) RETURNS float8 AS $BODY$ /** * * 使用固定余额递减法,计算一笔资产在给定期间内的折旧值。 * * 语法 * * DB(cost,salvage,life,period,month) * * Cost 为资产原值。 * * Salvage 为资产在折旧期末的价值(也称为资产残值)。 * * Life 为折旧期限(有时也可称作资产的生命周期)。 * * Period 为需要计算折旧值的期间。Period 必须使用与 life 相同的单位。 * * Month 为第一年的月份数,如省略,则假设为 12。 * * 说明 * * 固定余额递减法用于计算固定利率下的资产折旧值,函数 DB 使用下列计算公式来计算一个期间的折旧值: * * (cost - 前期折旧总值 ) * rate * * 式中: * * rate = 1 - ((salvage / cost) ^ (1 / life)),保留 3 位小数 * * 第一个周期和最后一个周期的折旧属于特例。对于第一个周期,函数 DB 的计算公式为: * * cost * rate * month / 12 * * 对于最后一个周期,函数 DB 的计算公式为: * * ((cost - 前期折旧总值) * rate * (12 - month)) / 12 * * 示例 * * 假定某工厂购买了一台新机器。价值为 $1,000,000,使用期限为 6 年。残值为  $100,000。下面的例子给出机器在使用期限内的历年折旧值,结果保留整数。 * DB(1000000,100000,6,1,7) 等于 $186,083 * DB(1000000,100000,6,2,7) 等于 $259,639 * DB(1000000,100000,6,3,7) 等于 $176,814 * DB(1000000,100000,6,4,7) 等于 $120,411 * DB(1000000,100000,6,5,7) 等于 $82,000 * DB(1000000,100000,6,6,7) 等于 $55,842 * DB(1000000,100000,6,7,7) 等于 $15,845 * */ DECLARE cost ALIAS FOR $1; salvage ALIAS FOR $2; life ALIAS FOR $3; period ALIAS FOR $4; monts ALIAS FOR $5; rec RECORD;rate numeric; result float8; count int4; total float8; BEGIN IF period > life + 1 THEN RAISE EXCEPTION 'period value : % is wrong!!!' , period; END IF; count :=1; rate := 1 - ((salvage / cost) ^ (1 / life)); rate := round(rate,3); --first period result := cost * rate * monts / 12; count := count +1; total :=result; --middle period IF period >1 AND period < life + 1 THEN WHILE count <=period LOOP result := (cost - total ) * rate; total :=total + result; count := count + 1; END LOOP; END IF; --last period IF period = life + 1 THEN WHILE count <=period-1 LOOP result := (cost - total ) * rate; total :=total + result; count := count + 1; END LOOP; result :=((cost - total) * rate * (12 - monts)) / 12; END IF; RETURN round(result::numeric,0); END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION db(float8, float8, float8, float8, float8) OWNER TO postgres;

?

读书人网 >操作系统

热点推荐