如何获取上一年所有记录?代码LastYear列返回本年数据问题
问题分析与修正
- 核心问题:
GETDATE() - 1仅将当前日期减1天,而非一整年,导致@prevYear变量实际获取的是当前年份(仅当当前是1月1日时,减1天才会落到上一年)。WHERE子句过滤出本年数据后,SUM(Amount)自然返回的是本年总和。
修正后的代码
DECLARE @prevYear int DECLARE @prevMonth int -- 正确获取上一年:用DATEADD函数减去一整年 SELECT @prevYear = DATEPART(year, DATEADD(year, -1, GETDATE())) -- 准确获取上个月:用DATEADD减一个月,比固定减30天适配不同月份天数 SELECT @prevMonth = DATEPART(month, DATEADD(month, -1, GETDATE())) SELECT SUM(CASE WHEN DATEPART(month, [OrderDate]) = @prevMonth THEN Amount ELSE 0 END) AS LastMonth, SUM(Amount) AS LastYear FROM Orders INNER JOIN OrderDetail ON Orders.OrderID = OrderDetail.OrderID WHERE DATEPART(year, [OrderDate]) = @prevYear
额外优化说明
- 计算上个月时,
DATEADD(month, -1, GETDATE())比固定减30天更可靠,能适配不同月份的天数差异(比如2月、31天的大月),保证拿到准确的上个月日期。 - 列别名无需加单引号,直接写
LastMonth即可,加单引号属于非标准写法,虽多数数据库兼容,但不符合SQL最佳实践。
内容的提问来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

