1、目的
根據最新的新個稅計算,自定義mysql函數,實現根據傳入參數計算出當月應繳的稅額。
2、代碼
CREATE DEFINER=`root`@`%` FUNCTION `TaxFunc`(
-- 應發工資
salary decimal(14,4),
-- 起征稅額
base decimal(14,4),
-- 保險
insurance DECIMAL(14,4),
-- 公積金
housing_fund DECIMAL(14,4),
-- 專項扣除
special_item DECIMAL(14,4),
-- 月份
mon int) RETURNS decimal(14,4)
BEGIN
DECLARE Jan DECIMAL(14,4);
DECLARE Feb DECIMAL(14,4);
DECLARE Mar DECIMAL(14,4);
DECLARE Apr DECIMAL(14,4);
DECLARE May DECIMAL(14,4);
DECLARE Jun DECIMAL(14,4);
DECLARE Jul DECIMAL(14,4);
DECLARE Aug DECIMAL(14,4);
DECLARE Sep DECIMAL(14,4);
DECLARE Oct DECIMAL(14,4);
DECLARE Nov DECIMAL(14,4);
DECLARE Dece DECIMAL(14,4);
DECLARE income DECIMAL(14,4);
-- 1月
-- 所得額 = (工資 - 起征稅額 - 社保 - 公積金 - 專項扣除)* 月份
set income = (salary-base-insurance-housing_fund-special_item) * 1;
set Jan = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920))))));
set Jan = IF(salary <= base, 0, Jan);
-- 2月
set income = (salary-base-insurance-housing_fund-special_item) * 2;
set Feb = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan;
set Feb = IF(salary <= base, 0, Feb);
-- 3月
set income = (salary-base-insurance-housing_fund-special_item) * 3;
set Mar = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb;
set Mar = IF(salary <= base, 0, Mar);
-- 4月
set income = (salary-base-insurance-housing_fund-special_item) * 4;
set Apr = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar;
set Apr = IF(salary <= base, 0, Apr);
-- 5月
set income = (salary-base-insurance-housing_fund-special_item) * 5;
set May = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr;
set May = IF(salary <= base, 0, May);
-- 6月
set income = (salary-base-insurance-housing_fund-special_item) * 6;
set Jun = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May;
set Jun = IF(salary <= base, 0, Jun);
-- 7月
set income = (salary-base-insurance-housing_fund-special_item) * 7;
set Jul = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun;
set Jul = IF(salary <= base, 0, Jul);
-- 8月
set income = (salary-base-insurance-housing_fund-special_item) * 8;
set Aug = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun - Jul;
set Aug = IF(salary <= base, 0, Aug);
-- 9月
set income = (salary-base-insurance-housing_fund-special_item) * 9;
set Sep = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug;
set Sep = IF(salary <= base, 0, Sep);
-- 10月
set income = (salary-base-insurance-housing_fund-special_item) * 10;
set Oct = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep;
set Oct = IF(salary <= base, 0, Oct);
-- 11月
set income = (salary-base-insurance-housing_fund-special_item) * 11;
set Nov = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep - Oct;
set Nov = IF(salary <= base, 0, Nov);
-- 12月
set income = (salary-base-insurance-housing_fund-special_item) * 12;
set Dece = IF(income <= 36000,income*0.03,IF(income <=144000,income*0.1-2520,IF(income<=300000,income*0.2-16920,IF(income<=420000,income*0.25-31920,IF(income<=660000,income*0.3-52920,IF(income<=960000,income*0.35-85920,income*0.45-181920)))))) - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep - Oct - Nov;
set Dece = IF(salary <= base, 0, Dece);
RETURN IF(mon = 1,Jan,IF(mon=2,Feb,IF(mon=3,Mar,IF(mon=4,Apr,IF(mon=5,May,IF(mon=6,Jun,IF(mon=7,Jul,IF(mon=8,Aug,IF(mon=9,Sep,IF(mon=10,Oct,IF(mon=11,Nov,Dece)))))))))));
END
3、測試
如果:一個員工每個月是32000元工資,保險扣3000元,公積金扣1500元,專項附加扣2200元。那么1月到4月的每個月應繳個稅金額:
SELECT
TaxFunc ( 32000, 5000, 3000, 1500, 2200, 1 ) 一月,
TaxFunc ( 32000, 5000, 3000, 1500, 2200, 2 ) 二月,
TaxFunc ( 32000, 5000, 3000, 1500, 2200, 3 ) 三月,
TaxFunc ( 32000, 5000, 3000, 1500, 2200, 4 ) 四月;
結果: