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

