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

SQL Server存储过程中传入指定年月参数,如何获取上月总计?

实现获取指定年月的上月总计的两种方法

针对你的需求,有两种简洁可靠的实现方式,无需复杂判断即可覆盖1月对应上一年12月的场景:


方法一:利用日期函数自动计算上月年月

通过构造传入年月的第一天,再用DATEADD函数直接推导出上月日期,自动适配所有月份的情况,代码更简洁且不易出错:

CREATE PROCEDURE SP_VALORS
    (@NIVEL VARCHAR(15),
     @MES INT,
     @AÑO INT)
AS
BEGIN
    DECLARE @TOTALMESACTUAL FLOAT, @TOTALMESPASADO FLOAT
    DECLARE @FECHA_INICIO_MES DATE

    -- 构造传入年月的第一天
    SET @FECHA_INICIO_MES = DATEFROMPARTS(@AÑO, @MES, 1)

    -- 获取当月总计
    SET @TOTALMESACTUAL = (SELECT SUM(MONTODEBITO) - SUM(MONTOCREDITO) 
                           FROM PRUEBAOPEX 
                           WHERE MONTH(FECHA) = @MES 
                             AND YEAR(FECHA) = @AÑO)

    -- 获取上月总计:通过DATEADD自动计算上月的年月
    SET @TOTALMESPASADO = (SELECT SUM(MONTODEBITO) - SUM(MONTOCREDITO) 
                           FROM PRUEBAOPEX 
                           WHERE MONTH(FECHA) = MONTH(DATEADD(MONTH, -1, @FECHA_INICIO_MES))
                             AND YEAR(FECHA) = YEAR(DATEADD(MONTH, -1, @FECHA_INICIO_MES)))

    -- 返回计算结果(可选)
    SELECT @TOTALMESACTUAL AS TotalMesActual, @TOTALMESPASADO AS TotalMesPasado
END

方法二:通过条件判断处理1月的特殊情况

如果更倾向于直观的逻辑判断,可以用CASE语句手动指定上月的年月:

CREATE PROCEDURE SP_VALORS
    (@NIVEL VARCHAR(15),
     @MES INT,
     @AÑO INT)
AS
BEGIN
    DECLARE @TOTALMESACTUAL FLOAT, @TOTALMESPASADO FLOAT
    DECLARE @MES_PASADO INT, @AÑO_PASADO INT

    -- 手动计算上月的月份和年份
    SET @MES_PASADO = CASE WHEN @MES = 1 THEN 12 ELSE @MES - 1 END
    SET @AÑO_PASADO = CASE WHEN @MES = 1 THEN @AÑO - 1 ELSE @AÑO END

    -- 获取当月总计
    SET @TOTALMESACTUAL = (SELECT SUM(MONTODEBITO) - SUM(MONTOCREDITO) 
                           FROM PRUEBAOPEX 
                           WHERE MONTH(FECHA) = @MES 
                             AND YEAR(FECHA) = @AÑO)

    -- 获取上月总计
    SET @TOTALMESPASADO = (SELECT SUM(MONTODEBITO) - SUM(MONTOCREDITO) 
                           FROM PRUEBAOPEX 
                           WHERE MONTH(FECHA) = @MES_PASADO 
                             AND YEAR(FECHA) = @AÑO_PASADO)

    -- 返回计算结果(可选)
    SELECT @TOTALMESACTUAL AS TotalMesActual, @TOTALMESPASADO AS TotalMesPasado
END

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:20:41