You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在SQL Server中用单查询获取昨日、近7日、上月数据?

在SQL Server中一次性统计昨日、近7日、上月数据的查询方案

我来帮你搞定这个统计需求!在SQL Server里,咱们可以用条件聚合的方式,通过单个查询就能同时算出这三个时间段的记录数,完美匹配你想要的结果格式。

核心思路是:按Field1分组,对每个分组分别用CASE WHEN判断记录是否属于目标时间段,再用COUNT统计符合条件的记录数量。下面是具体的实现代码,我会给你标注清楚每个部分的逻辑:

SELECT
    Field1,
    -- 统计昨日的记录数:判断startdate是否落在昨日的自然日内
    COUNT(CASE WHEN CAST(startdate AS DATE) = DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) THEN 1 END) AS Yesterday,
    -- 统计近7日的记录数:过去7天(包含今日);若要排除今日,把条件改成startdate >= DATEADD(DAY, -7, GETDATE()) AND startdate < CAST(GETDATE() AS DATE)
    COUNT(CASE WHEN startdate >= DATEADD(DAY, -7, GETDATE()) THEN 1 END) AS Last7Days,
    -- 统计上月的记录数:精准匹配上月的完整自然月范围
    COUNT(CASE WHEN startdate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) 
                AND startdate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) THEN 1 END) AS LastMonth
FROM
    YourTable  -- 替换成你的实际表名
-- 可选:过滤掉startdate为空的无效记录
WHERE
    startdate IS NOT NULL
GROUP BY
    Field1
ORDER BY
    Field1;

额外说明(根据你的实际场景调整)

如果你的需求是统计记录的有效时间段(startdate到enddate)与目标时间段有重叠的记录(而不是仅startdate在目标时间段内),可以修改CASE WHEN里的条件:

  • 昨日重叠的判断示例:
    CASE WHEN startdate < CAST(GETDATE() AS DATE) AND enddate >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) THEN 1 END
    
  • 上月重叠的判断示例:
    CASE WHEN startdate < DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0) 
         AND enddate >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()) - 1, 0) THEN 1 END
    

这样就能灵活适配不同的业务统计规则啦!

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

火山引擎 最新活动