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

介绍了一个使用固定余额递减法计算资产折旧值的数据库函数DB。该函数适用于计算特定期间内资产的折旧金额,并提供了计算示例。
-- 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;

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值