SQL Server中如何正确查询月份并实现分组统计
问题成因
DATENAME()返回值全部为一月的核心原因是参数传递错误:
DATEPART(MONTH FROM TransactionDate)的返回结果是1~12的整数,仅代表对应日期的月份序号,本身不是合法的日期类型值。- SQL Server在接收到整数类型的日期参数时,会默认将其解释为距离基准日期
1900-01-01 00:00:00的天数偏移量。1~12的偏移量对应的日期全部落在1900年1月的时间范围内,因此无论实际交易日期属于哪个月,DATENAME()识别到的月份永远是一月。
修正后的写法
直接将原始交易日期字段传入DATENAME()即可,分组时同步调整字段,同时建议增加月份序号排序逻辑,避免结果按月份英文字母序排列出现乱序:
SELECT DATENAME(MONTH, TransactionDate) AS Month_Name, SUM(ABS(Income)) AS Income FROM Transactions -- 如需限定统计周期,可在此处添加WHERE条件,例如 WHERE TransactionDate BETWEEN '2024-01-01' AND '2024-12-31' GROUP BY DATEPART(MONTH, TransactionDate), DATENAME(MONTH, TransactionDate) ORDER BY DATEPART(MONTH, TransactionDate)
跨年度统计注意事项
如果统计范围覆盖多个自然年,建议把年份维度加入查询逻辑,避免不同年份的同月份数据被错误合并:
SELECT YEAR(TransactionDate) AS Transaction_Year, DATENAME(MONTH, TransactionDate) AS Month_Name, SUM(ABS(Income)) AS Income FROM Transactions GROUP BY YEAR(TransactionDate), DATEPART(MONTH, TransactionDate), DATENAME(MONTH, TransactionDate) ORDER BY Transaction_Year, DATEPART(MONTH, TransactionDate)
内容的提问来源于stack exchange,提问作者Klaus
相关产品推荐
相关产品推荐

