SQL返回特定年份以来的年份列表

Gra*_*eme 27 t-sql sql-server sql-server-2005

我需要一个年份列表作为记录集从2004年到当前年度(以desc顺序),而不编写存储过程.这可能吗?(SQL Server 2005).所以它应该返回:

2009
2008
2007
2006
2005
2004

Jos*_*ody 49

这使用递归CTE从2004年到现在的所有年份:

with yearlist as 
(
    select 2004 as year
    union all
    select yl.year + 1 as year
    from yearlist yl
    where yl.year + 1 <= YEAR(GetDate())
)

select year from yearlist order by year desc;
Run Code Online (Sandbox Code Playgroud)

  • 我倾向于对那些完全错误的答案保留投票,而不是对我根本不喜欢的答案。我知道这是一个非常主观的领域,但我不认为我们三个人值得你投反对票。 (2认同)

Lie*_*ers 5

ROW_NUMBER在任何足够大(稳定)的表中的任何列上使用将是一种方法。

SELECT *
FROM (
  SELECT TOP 100 2003 + ROW_NUMBER() OVER (ORDER BY <AnyColumn>) AS Yr
  FROM dbo.<AnyTable>
  ) Years
WHERE Yr <= YEAR(GETDATE())
Run Code Online (Sandbox Code Playgroud)

请注意,<AnyTable>应至少包含等于您需要的年数的行数。

编辑(库多对约书亚)

  • 最好选择一个您知道不会被截断和/或删除的表。system table应该想到一个足够大的。
  • 目前,作为一个更老更聪明(至少更老)的人,我将使用CTE约书亚给出的答案中提到的类似方法来实现这个要求。该CTE技术比当前给定的ROW_NUMBER解决方案优越得多且不易出错。


DJ.*_*DJ. 5

更新以返回当前年份加上前 5 年。应该非常快,因为这是一个小记录集。

SELECT YEAR(GETDATE()) as YearNum
UNION
SELECT YEAR(GETDATE()) - 1 as YearNum
UNION
SELECT YEAR(GETDATE()) - 2 as YearNum
UNION
SELECT YEAR(GETDATE()) - 3 as YearNum
UNION
SELECT YEAR(GETDATE()) - 4 as YearNum
UNION
SELECT YEAR(GETDATE()) - 5 as YearNum
ORDER BY YearNum DESC
Run Code Online (Sandbox Code Playgroud)