You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server自定义PMT函数与Excel PMT结果不一致,求修正方法

调整SQL Server自定义PMT函数以匹配Excel期初付款结果

Excel PMT函数参数说明

Excel的PMT完整语法是PMT(rate, nper, pv, [fv], [type]),你用到的两个额外参数含义如下:

  • fv:未来值,指最后一期付款完成后剩余的金额,默认值为0
  • type:付款时间标识,0表示期末付款(默认行为),1表示期初付款

你的SQL函数当前仅实现了期末付款的计算逻辑,而Excel调用时指定了type=1,这是两者结果差异的核心原因。

修改后的SQL Server PMT函数

CREATE FUNCTION dbo.PMT
(
    @rate FLOAT,
    @periods NUMERIC(20,7),
    @principal NUMERIC(20,2),
    @fv NUMERIC(20,2) = 0, -- 新增未来值参数,默认0
    @type INT = 0 -- 新增付款类型参数,0=期末(默认),1=期初
)
RETURNS NUMERIC(38,9)
AS
BEGIN
    DECLARE @pmt NUMERIC(38,9)
    DECLARE @WK_periods FLOAT,
            @WK_principal FLOAT,
            @WK_fv FLOAT,
            @WK_One FLOAT,
            @WK_power FLOAT

    SELECT  @WK_periods = @periods,
            @WK_principal = @principal,
            @WK_fv = @fv,
            @WK_One = 1

    -- 计算复利因子
    SET @WK_power = POWER(@WK_One + @rate, @WK_periods)

    IF @type = 1
        -- 期初付款公式
        SET @pmt = ROUND(
            ((@WK_principal * @rate * @WK_power) + @WK_fv * @rate) 
            / ((@WK_power - @WK_One) * (@WK_One + @rate)),
        9)
    ELSE
        -- 期末付款公式(原逻辑)
        SET @pmt = ROUND(
            ((@WK_principal * @rate * @WK_power) + @WK_fv * @rate) 
            / (@WK_power - @WK_One),
        9)

    RETURN @pmt
END
GO

验证结果

使用你提供的参数调用修改后的函数:

SELECT dbo.PMT(0.006313333, 251.1762480, 1814647.77, 0, 1)

返回结果为14334.96,与Excel的计算结果一致。

内容的提问来源于stack exchange,提问作者Aweda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 11:36:12