sql server - una - SQL para devolver la lista de años desde un año específico
traer el ultimo registro de una tabla sql (9)
Necesito una lista de años como un juego de registros desde 2004 hasta el año en curso (en orden de desc), sin escribir un procedimiento almacenado . es posible? (SQL Server 2005). Entonces debería volver:
2009
2008
2007
2006
2005
2004
Actualizado para devolver el año en curso más los 5 años anteriores. Debe ser muy rápido ya que este es un pequeño conjunto de registros.
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
Creo que necesita crear una tabla de fechas, luego seleccione su rango. También puede ser útil cuando necesita seleccionar un rango de fechas con X datos adjuntos y no tener días perdidos.
Esta es una consulta simple, revisa esto
(SELECT REPLACE((TO_CHAR(SYSDATE,''YYYY'')-Rownum)+1,'' '',NULL) yr FROM dual CONNECT BY LEVEL < 32) year
Esto lleva todos los años desde 2004 hasta el presente, utilizando un CTE recursivo:
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;
Prueba esto:
declare @lowyear int
set @lowyear = 2004
declare @thisyear int
set @thisyear = year(getdate())
while @thisyear >= @lowyear
begin
print @thisyear
set @thisyear = (@thisyear - 1)
end
Devoluciones
2009
2008
2007
2006
2005
2004
Cuando llegue al 1 de enero de 2010. Volverá el mismo código:
2010
2009
2008
2007
2006
2005
2004
Usar ROW_NUMBER
en cualquier columna de cualquier tabla suficientemente grande (estable) sería una forma de hacerlo.
SELECT *
FROM (
SELECT TOP 100 2003 + ROW_NUMBER() OVER (ORDER BY <AnyColumn>) AS Yr
FROM dbo.<AnyTable>
) Years
WHERE Yr <= YEAR(GETDATE())
Tenga en cuenta que <AnyTable>
debe contener al menos la cantidad de filas igual a la cantidad de años que necesita.
Editar (Cudo a Joshua)
- Preferiblemente, seleccionaría una tabla que sabe que no se truncará ni eliminará. Una
system table
suficientemente grande debe venir a la mente. - En la actualidad, siendo mucho mayor y más sabio (al menos mayor), implementaría este requisito utilizando un
CTE
como el mencionado en la respuesta dada por Joshua. La técnicaCTE
es muy superior y menos propensa a errores que la actual soluciónROW_NUMBER
.
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
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
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