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
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;
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.
system table
assez grand devrait venir à l'esprit.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
.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
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
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
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
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
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