小编典典

SQL-创建临时表或每月第一天和月份名称的CTE

sql

我需要在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循环对一年中的所有月份进行迭代,然后对所有年份进行迭代。


阅读 242

收藏
2021-03-08

共1个答案

小编典典

使用递归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
2021-03-08