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

标签 sql sql-server sql-server-2012

我需要在 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/

相关文章:

sql-server - SQL Server 2012 的 STRING_ESCAPE( 'SOME TEXT' , 'json' ) 替代方案

sql - TSQL - 通过引用其他列来填充条目上方和下方的值

SQL查询返回与逗号分隔字符串具有相同ID的元素

Mysql更新列替换部分文本

sql-server - 任何将 SQLite 数据库转换为 sql server 的工具?

SQL Server,连接到具有相同列的多个表

sql-server - 如何使用xpath在SQL Server中查询XML元素的属性值

sql-server - 如何对数字范围进行数据透视查询并对结果进行排序?

mysql - 尝试编写复杂的查询来检索数据

mysql - 按一年中的月份获取特定行的排名