Мне нужен список лет как набор записей, начиная с 2004 года до текущего года (в порядке desc), без записи хранимой процедуры. Это возможно? (SQL Server 2005). Поэтому он должен вернуться:
2009
2008
2007
2006
2005
2004
Мне нужен список лет как набор записей, начиная с 2004 года до текущего года (в порядке desc), без записи хранимой процедуры. Это возможно? (SQL Server 2005). Поэтому он должен вернуться:
2009
2008
2007
2006
2005
2004
Это получает все годы с 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;
Использование 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>
должно содержать как минимум количество строк, равное количеству требуемых лет.
system table
должно прийти на ум.CTE
, как указано в ответе Джошуа. Техника CTE
намного превосходит и меньше подвержена ошибкам, чем текущее заданное решение ROW_NUMBER
.Обновлен для возврата текущего года плюс предыдущие 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
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
Попробуйте следующее:
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
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
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
Это простой запрос, проверьте этот
(SELECT REPLACE((TO_CHAR(SYSDATE,'YYYY')-Rownum)+1,' ',NULL) yr FROM dual CONNECT BY LEVEL < 32) year
Я думаю, вам нужно создать таблицу дат, а затем просто выбрать свой диапазон. Он также может оказаться полезным, когда вам нужно выбрать диапазон дат с прикрепленными данными X и не пропустить пропущенные дни.