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

SQL Server基于issue_date字段查询上月数据的正确语句求助

正确获取SQL Server中上月记录的查询语句

看起来你之前的查询只匹配了月份,但没限制日期的上限,所以才会返回3月1日至今的记录。别担心,我给你两种可靠的解决方案,适配你的issue_date字段(需要通过DATEADD转换为实际日期的情况):


方法1:使用日期区间查询(推荐,性能更优)

这种方法通过计算上个月的第一天和最后一天,精准筛选出该区间内的所有记录,即使当前是1月份(比如1月查询去年12月的数据)也能正常工作:

-- 先定义上个月的起止日期变量,逻辑更清晰
DECLARE @LastMonthStart DATE = DATEFROMPARTS(YEAR(DATEADD(month, -1, GETDATE())), MONTH(DATEADD(month, -1, GETDATE())), 1);
DECLARE @LastMonthEnd DATE = EOMONTH(@LastMonthStart);

SELECT *
FROM wo_header
WHERE 
    -- 将issue_date转换为实际日期
    DATEADD(day, wo_header.issue_date, '1971-12-31') 
    -- 筛选在上个月区间内的记录
    BETWEEN @LastMonthStart AND @LastMonthEnd;

如果不想用变量,也可以直接写在WHERE子句里:

SELECT *
FROM wo_header
WHERE 
    DATEADD(day, wo_header.issue_date, '1971-12-31') 
    BETWEEN DATEFROMPARTS(YEAR(DATEADD(month, -1, GETDATE())), MONTH(DATEADD(month, -1, GETDATE())), 1)
    AND EOMONTH(DATEADD(month, -1, GETDATE()));

方法2:通过年份+月份匹配

如果你更习惯用DATEPART来判断,也可以直接比较转换后日期的年份和月份是否等于上个月的年份和月份:

SELECT *
FROM wo_header
WHERE 
    YEAR(DATEADD(day, wo_header.issue_date, '1971-12-31')) = YEAR(DATEADD(month, -1, GETDATE()))
    AND MONTH(DATEADD(day, wo_header.issue_date, '1971-12-31')) = MONTH(DATEADD(month, -1, GETDATE()));

为什么你的原查询出错?

你之前的代码只检查了月份是否为上个月,但没有限制日期不能超过上个月的最后一天,所以当当前日期是4月27日时,会把3月1日到4月27日的所有记录都返回。上面的两种方法都解决了这个问题,确保只获取上个月的完整数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:07:54