如何修改SQL查询以获取2022年各月份的天数?
解决方案
你可以使用递归CTE生成2022年的所有月份,再结合EOMONTH函数获取每个月的天数,具体查询如下:
WITH Months2022 AS ( -- 初始化2022年1月1日 SELECT DATEFROMPARTS(2022, 1, 1) AS MonthStart UNION ALL -- 递归生成后续每个月的第一天 SELECT DATEADD(MONTH, 1, MonthStart) FROM Months2022 WHERE MonthStart < DATEFROMPARTS(2022, 12, 1) ) SELECT DATENAME(MONTH, MonthStart) AS 月份名称, MONTH(MonthStart) AS 月份编号, DAY(EOMONTH(MonthStart)) AS 当月天数 FROM Months2022 ORDER BY 月份编号;
说明
- 递归CTE
Months2022:从2022年1月1日开始,每次递增一个月,生成全年12个月份的第一天。 - 日期函数解析:
DATENAME(MONTH, MonthStart):获取月份的英文名称(若需要中文名称,可在查询前添加SET LANGUAGE Chinese;,此时会返回“一月”“二月”等中文名称)MONTH(MonthStart):获取月份的数字编号DAY(EOMONTH(MonthStart)):通过EOMONTH获取当月最后一天,再用DAY提取天数。EOMONTH仅在SQL Server 2012及以上版本可用,若使用更早版本,可替换为DAY(DATEADD(DAY, -1, DATEADD(MONTH, 1, MonthStart)))
- 排序:按月份编号排序确保结果顺序正确。
输出示例
| 月份名称 | 月份编号 | 当月天数 |
|---|---|---|
| January | 1 | 31 |
| February | 2 | 28 |
| March | 3 | 31 |
| April | 4 | 30 |
| May | 5 | 31 |
| June | 6 | 30 |
| July | 7 | 31 |
| August | 8 | 31 |
| September | 9 | 30 |
| October | 10 | 31 |
| November | 11 | 30 |
| December | 12 | 31 |
内容的提问来源于stack exchange,提问作者Samikshya Patro
相关产品推荐
相关产品推荐

