web-dev-qa-db-fra.com

SQL pour retourner la liste des années depuis une année spécifique

J'ai besoin d'une liste d'années en tant que jeu d'enregistrements commençant de 2004 à l'année en cours (par ordre décroissant), sans écrire de procédure stockée . Est-ce possible? (SQL Server 2005). Donc, il devrait retourner:

2009
2008
2007
2006
2005
2004

26
Graeme

Cela concerne toutes les années de 2004 à nos jours, en utilisant un CTE récursif:

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;
45
Joshua Carmody

Utiliser ROW_NUMBER sur n'importe quelle colonne d'une table suffisamment grande (stable) serait un moyen de le faire. 

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

Notez que <AnyTable> doit contenir au moins le nombre de lignes égal au nombre d'années requis.

Edit (Cudo à Josué)

  • De préférence, vous choisirez une table qui, à votre connaissance, ne sera ni tronquée ni supprimée. Un system table assez grand devrait venir à l'esprit.
  • Actuellement, étant beaucoup plus âgé et plus sage (au moins plus âgé), je mettrais en œuvre cette exigence en utilisant un CTE comme mentionné dans la réponse donnée par Joshua. La technique CTE est de loin supérieure et moins sujette aux erreurs que la solution actuelle ROW_NUMBER.
4

Mis à jour pour retourner l'année en cours plus les 5 années précédentes. Devrait être très rapide car il s'agit d'un petit jeu d'enregistrements.

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
4
DJ.
DECLARE @YEARS TABLE (Y INT)
DECLARE @I INT, @NY INT
SELECT @I = 2004, @NY = YEAR(GETDATE())
WHILE @I <= @NY BEGIN
    INSERT @YEARS SELECT @I
    SET @I = @I + 1
END
SELECT Y 
FROM @YEARS
ORDER BY Y DESC
3
Maksym Gontar
WITH n(n) AS
(
    SELECT 0
    UNION ALL
    SELECT n+1 FROM n WHERE n < 10
)
SELECT year(DATEADD( YY, -n, GetDate())) 
FROM n ORDER BY n
1
sunny

Essaye ça:

    declare @lowyear int
set @lowyear = 2004
declare @thisyear int
set @thisyear = year(getdate())
while @thisyear >= @lowyear
begin
print @thisyear
set @thisyear = (@thisyear - 1)
end

Résultats

2009
2008
2007
2006
2005
2004

Lorsque vous frappez le 1 janvier 2010. Le même code retournera:

2010
2009
2008
2007
2006
2005
2004
1
Eppz

Ceci est une requête simple, cochez cette 

(SELECT REPLACE((TO_CHAR(SYSDATE,'YYYY')-Rownum)+1,' ',NULL) yr FROM dual CONNECT BY LEVEL < 32) year
0
user3852207
SET NOCOUNT ON
DECLARE @max int
set @max = DATEPART(year, getdate())

CREATE TABLE #temp (val int)

while @max >= 2004
  BEGIN
    insert #temp(val) values(@max)
    set @max = @max - 1
  END

SELECT * from #temp
0
scottm