编写存储过程统计日志表近6个月每月记录数
问题
我有一张包含TimeStamp和Action列的日志表,表数据示例如下:
| TimeStamp | Action |
|---|---|
| 2022-10-13 16:24:42.803 | ... |
| 2022-10-12 16:24:42.703 | ... |
| 2022-10-12 10:23:42.809 | ... |
| 2022-10-11 16:21:42.903 | ... |
| 2022-10-10 10:24:42.803 | ... |
需要编写一个存储过程,返回近6个月每个月的记录数量,预期输出格式如下:
| Month | records |
|---|---|
| 2022-10 | 366 |
| 2022-09 | 193 |
| 2022-08 | 276 |
| 2022-07 | 233 |
| 2022-06 | 215 |
| 2022-05 | 117 |
我已编写初始代码如下:
DECLARE @monthly_records TABLE (Month varchar(50), Records int) DECLARE @cnt INT = 0; WHILE @cnt < 6 BEGIN INSERT INTO @monthly_records (Month, Records) VALUES (? , ?) SET @cnt = @cnt + 1; END SELECT * FROM @monthly_records
请完善该代码以实现需求。
解决方案
以下是完善后的存储过程代码,可直接实现近6个月记录数统计的需求:
CREATE PROCEDURE GetLastSixMonthsRecords AS BEGIN SET NOCOUNT ON; DECLARE @monthly_records TABLE (Month varchar(7), Records int); DECLARE @cnt INT = 0; -- 获取当前月份的第一天作为基准点 DECLARE @currentMonthStart DATE = DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1); WHILE @cnt < 6 BEGIN -- 计算当前循环对应的目标月份起始日期 DECLARE @targetMonthStart DATE = DATEADD(MONTH, -@cnt, @currentMonthStart); -- 格式化为yyyy-MM的月份字符串 DECLARE @monthStr VARCHAR(7) = FORMAT(@targetMonthStart, 'yyyy-MM'); -- 统计该月份的记录总数 DECLARE @recordCount INT; SELECT @recordCount = COUNT(*) FROM YourLogTable -- 此处替换为你的日志表实际名称 WHERE TimeStamp >= @targetMonthStart AND TimeStamp < DATEADD(MONTH, 1, @targetMonthStart); -- 插入统计结果,用ISNULL确保无记录时返回0 INSERT INTO @monthly_records (Month, Records) VALUES (@monthStr, ISNULL(@recordCount, 0)); SET @cnt = @cnt + 1; END -- 按月份倒序输出,匹配预期的最新到最旧顺序 SELECT Month, Records FROM @monthly_records ORDER BY Month DESC; END
核心逻辑说明
- 以当前月份第一天为基准,通过循环依次生成近6个月的起始日期
- 使用
TimeStamp >= 当月第一天 AND TimeStamp < 下月第一天的条件,精准锁定每个月的记录范围,避免跨时间点的统计误差 - 用
FORMAT统一月份的输出格式为yyyy-MM,完全匹配预期输出要求 - 处理无记录的月份时,用
ISNULL返回0而非NULL,保证结果完整性
注意:需将代码中的YourLogTable替换为你的日志表实际名称。
内容的提问来源于stack exchange,提问作者rotem
相关产品推荐
相关产品推荐

