-- 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;