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
相关产品推荐
相关产品推荐

