我需要在 SQL Server 2012 环境中基于 2 个参数创建临时表或公用表表达式
@calYear
@currentYear
所以如果 @calYear = 5
和 @currentYear='2014'
我想生成一个 5 年的临时表,从当年开始,有 4 列,比如
YearDesc MonthName MonthNum FirstDayOfMonth
2014 Jan 1 1/1/2014
2014 Feb 2 2/1/2014
2014 Mar 3 3/1/2014
...
...
...
2018 Oct 10 10/1/2018
2018 Nov 11 11/1/2018
2018 Dec 12 12/1/2018
是否可以高效地执行 Do While 循环?我将如何解释月份名称? 我正在使用一个非常麻烦的 Do While 循环来迭代一年中的所有月份,然后迭代所有年份。
最佳答案
使用递归 cte 的一种方法:
declare @calYear int = 5, @currentYear char(4) = '2014'
;with cte (dt) as (
select DATEFROMPARTS(@currentyear,1,1) dt
union all
select dateadd(month,1,dt)
from cte where dt < dateadd(year,@calyear,DATEFROMPARTS(@currentyear,1,1))
)
select year(dt) YearDesc, datename(month, dt) MonthName, month(dt) MonthNum, dt FirstDayOfMonth
from cte
order by dt
或者使用数字表:(在本例中为 master..spt_values)
declare @calYear int = 5, @currentYear char(4) = '2014'
;with cte2 (dt) as (
select dateadd(month,number,DATEFROMPARTS(@currentyear,1,1)) dt
from master..spt_values where type = 'p'
and number <= 12*@calYear
)
select year(dt) YearDesc, datename(month, dt) MonthName, month(dt) MonthNum, dt FirstDayOfMonth
from cte2
order by dt
关于SQL - 创建月份第一天和月份名称的临时表或 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003833/