Подтвердить что ты не робот

SQL, чтобы вернуть список лет с определенного года

Мне нужен список лет как набор записей, начиная с 2004 года до текущего года (в порядке desc), без записи хранимой процедуры. Это возможно? (SQL Server 2005). Поэтому он должен вернуться:

2009
2008
2007
2006
2005
2004

4b9b3361

Ответ 1

Это получает все годы с 2004 года по настоящее время, используя рекурсивный CTE:

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;

Ответ 2

Использование ROW_NUMBER в любом столбце из любой достаточно большой (стабильной) таблицы было бы одним из способов сделать это.

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

Обратите внимание, что <AnyTable> должно содержать как минимум количество строк, равное количеству требуемых лет.

Изменить (Cudo to Joshua)

  • Желательно, чтобы вы выбрали таблицу, которую, как вы знаете, не будут усечены и/или удалены. Достаточно большое system table должно прийти на ум.
  • В настоящее время, будучи намного старше и мудрее (по крайней мере, старше), я бы выполнил это требование, используя CTE, как указано в ответе Джошуа. Техника CTE намного превосходит и меньше подвержена ошибкам, чем текущее заданное решение ROW_NUMBER.

Ответ 3

Обновлен для возврата текущего года плюс предыдущие 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

Ответ 4

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

Ответ 5

Попробуйте следующее:

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

Возвращает

2009
2008
2007
2006
2005
2004

Когда вы нажмете 1 января 2010 года. Тот же код вернет:

2010
2009
2008
2007
2006
2005
2004

Ответ 6

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

Ответ 7

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

Ответ 8

Это простой запрос, проверьте этот

(SELECT REPLACE((TO_CHAR(SYSDATE,'YYYY')-Rownum)+1,' ',NULL) yr FROM dual CONNECT BY LEVEL < 32) year

Ответ 9

Я думаю, вам нужно создать таблицу дат, а затем просто выбрать свой диапазон. Он также может оказаться полезным, когда вам нужно выбрать диапазон дат с прикрепленными данными X и не пропустить пропущенные дни.