Получите все годы между 2 обеспеченными датами

Если у меня есть два года, например:

YEAR(@STARTDATE) -- 2011
YEAR(@ENDDATE)   -- 2015

Как я могу составить названную таблицу временного секретаря #YEARRANGE , который будет содержать все годы между этими двумя, если, включал @STARTDATE и @ENDDATE . Другими словами, это будет похоже так:

#YEARRANGE
==========
- 2011
- 2012
- 2013
- 2014
- 2015
3
Возможный дубликат: stackoverflow.com/questions/626797/…
добавлено автор Evaldas Buinauskas, источник

7 ответы

Можно попробовать как это:

DECLARE 
      @start DATE = '20120201'
    , @end DATE = '20150405'

;WITH cte AS 
(
    SELECT YEAR(@start) AS [Year]
    UNION ALL
    SELECT yl.[Year]+ 1 as [Year]
    FROM cte  yl
    WHERE yl.[year] + 1 <= Year(@end)
)
SELECT CONVERT(CHAR(4), [Year], 120) 
FROM cte
0
добавлено

Вот другое решение, используя Стол Счета:

DECLARE @startDate DATE = '20110101'
DECLARE @endDate DATE = '20150101'

;WITH E1(N) AS(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
)
,E2(N) AS(SELECT 1 FROM E1 a, E1 b)
,E4(N) AS(SELECT 1 FROM E2 a, E2 b)
,Tally(N) AS(
    SELECT TOP(DATEDIFF(YEAR, @startDate, @endDate) + 1) 
        ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
    FROM E4
)
SELECT
    YEAR(@startDate) + (N-1)
FROM Tally
WHERE
    YEAR(@startDate) + (N-1) <= YEAR(@endDate)
0
добавлено

Можно сделать это с рекурсивным cte и затем непосредственно составить таблицу временного секретаря, используя избранный в заявление, которое автоматически составляет таблицу временного секретаря без явного создания последнего:

DECLARE @sd INT = 2011, @ed INT = 2015

;WITH cte AS(SELECT @sd AS y
             UNION ALL
             SELECT y + 1 FROM cte WHERE y < @ed)
SELECT * INTO #YEARRANGE FROM cte
0
добавлено
DECLARE @STARTDATE DATE, @ENDDATE DATE

SET @STARTDATE = '2011-01-10'
SET @ENDDATE = '2015-06-16'

CREATE TABLE #YEARRANGE([YEAR] INT)

;WITH C AS (
        SELECT  DATEPART(YEAR, @STARTDATE) AS yr
        UNION ALL
        SELECT yr + 1
        FROM C
        WHERE yr < DATEPART(YEAR, @ENDDATE)
        )
INSERT INTO #YEARRANGE
SELECT yr
FROM C
ORDER BY yr

SELECT * FROM #YEARRANGE

Продукция

YEAR
------------
2011
2012
2013
2014
2015
0
добавлено
DECLARE @STARTDATE INT  = 2011

DECLARE @ENDDATE INT = 2015

CREATE TABLE #YEARRANGE([YEAR] INT)

WHILE @STARTDATE <= @ENDDATE
BEGIN
    INSERT INTO #YEARRANGE
    VALUES(@STARTDATE)

    SET @STARTDATE = @STARTDATE + 1
END


SELECT * FROM #YEARRANGE

DROP TABLE #YEARRANGE
0
добавлено
CREATE TABLE #YEARRANGE
(
    Years INT
)

DECLARE @STARTDATE DATE,
        @ENDDATE DATE;
SET @STARTDATE = '20110101';
SET @ENDDATE = '20150101';

WITH GetYears 
AS
(
    SELECT YEAR(@STARTDATE) AS Years
    UNION ALL
    SELECT yl.Years+ 1 as Years
    FROM GetYears yl
    WHERE yl.Years + 1 <= YEAR(@ENDDATE)
)
INSERT INTO #YEARRANGE
SELECT Years FROM GetYears ORDER BY Years;

SELECT * FROM #YEARRANGE

DROP TABLE #YEARRANGE

ПРОДУКЦИЯ:

year
2011
2012
2013
2014
2015
0
добавлено

Welp, кто-то, возможно, избил меня к этому изменению.

Declare @StartYear int = 2011
    , @EndYear int = 2015
Declare @YearDiff int = @EndYear - @StartYear 
    , @i int =0 --Counter

if OBJECT_ID('tempdb..#YEARRANGE') is not null
    drop table #YEARRANGE;
Create Table #YEARRANGE (YearRange int)

-- I hate loops in SQL.
while @i <= @YearDiff
begin
    INSERT INTO #YEARRANGE
    select @i + @StartYear
    set @i +=1;
end

/*  Tada    */
Select * 
from #YEARRANGE
0
добавлено
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)