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

SQL Server如何实现当月无数据或每月1号时查询返回上月数据

实现方案

你可以通过「先计算目标时间区间,再匹配数据,无数据时自动回退上月」的逻辑实现,以下是可直接复用的SQL模板:

步骤1:计算时间边界变量

DECLARE @Today DATE = GETDATE();
DECLARE @FirstDayOfCurrentMonth DATE = DATEFROMPARTS(YEAR(@Today), MONTH(@Today), 1);
DECLARE @FirstDayOfLastMonth DATE = DATEADD(MONTH, -1, @FirstDayOfCurrentMonth);
DECLARE @LastDayOfLastMonth DATE = EOMONTH(@FirstDayOfLastMonth);
DECLARE @TargetStart DATE, @TargetEnd DATE;

-- 判断执行日期是否为当月1号
IF @Today = @FirstDayOfCurrentMonth
BEGIN
    -- 1号直接用上月全月作为目标查询区间
    SET @TargetStart = @FirstDayOfLastMonth;
    SET @TargetEnd = @LastDayOfLastMonth;
END
ELSE
BEGIN
    -- 非1号优先用当月1号到当天作为目标查询区间
    SET @TargetStart = @FirstDayOfCurrentMonth;
    SET @TargetEnd = @Today;
END

步骤2:实现区间匹配+无数据自动回退逻辑

用EXISTS判断优先区间是否有数据,无数据时自动切换到上月区间,将代码中的你的业务表名、日期字段替换为实际的表名和存储时间的字段即可:

SELECT *
FROM 你的业务表名
WHERE 
-- 优先匹配目标区间
(EXISTS (SELECT 1 FROM 你的业务表名 WHERE 日期字段 BETWEEN @TargetStart AND @TargetEnd) 
 AND 日期字段 BETWEEN @TargetStart AND @TargetEnd)
OR
-- 目标区间无数据时匹配上月全量
(NOT EXISTS (SELECT 1 FROM 你的业务表名 WHERE 日期字段 BETWEEN @TargetStart AND @TargetEnd)
 AND 日期字段 BETWEEN @FirstDayOfLastMonth AND @LastDayOfLastMonth)

逻辑验证

  • 10月1号执行:目标区间直接设为9月全月,返回9月所有数据
  • 9月3号执行且9月有数据:返回9月1日到9月3日的数据
  • 9月3号执行且9月无任何数据:自动回退返回8月全量数据

大数据量优化方案

如果你的表数据量较大,可以提前单独做数据存在性判断,避免单次查询重复扫描全表:

DECLARE @HasCurrentData BIT;
SELECT @HasCurrentData = CASE WHEN EXISTS(SELECT 1 FROM 你的业务表名 WHERE 日期字段 BETWEEN @TargetStart AND @TargetEnd) THEN 1 ELSE 0 END;

SELECT * FROM 你的业务表名
WHERE 
    (@HasCurrentData = 1 AND 日期字段 BETWEEN @TargetStart AND @TargetEnd)
    OR 
    (@HasCurrentData = 0 AND 日期字段 BETWEEN @FirstDayOfLastMonth AND @LastDayOfLastMonth)

内容的提问来源于stack exchange,提问作者Nelson FIGUEROA SERRANO

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:09:03