Динамическое отображение месяцев за указанную дату - PullRequest
0 голосов
/ 05 октября 2018

У меня есть требование, когда мне нужно динамически возвращать месяцы с указанной даты.

Например, если входное значение равно 2018-05-20, то выходное значение должно быть

May
June
July
'
'
'
April

Ответы [ 5 ]

0 голосов
/ 05 октября 2018

Вы также можете сделать это таким образом

DECLARE @Date date = '20180520';

SELECT DATENAME(MONTH,DATEADD(MONTH, V.[Numbers], @Date)) AS Months
FROM (
SELECT  TOP (11 - 0+1) ROW_NUMBER() OVER (ORDER BY S.[object_id])+(0 - 1) [Numbers]
FROM    sys.all_objects S WITH (NOLOCK)
) V
0 голосов
/ 05 октября 2018

Лично я бы использовал таблицу подсчета, а не rCTE.Учитывая, что вам нужно только 0-11, вы можете легко «жестко закодировать» значения:

DECLARE @Date date = '20180520';

SELECT DATENAME(MONTH,DATEADD(MONTH, V.M, @Date))
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) V(M)
ORDER BY V.M;
0 голосов
/ 05 октября 2018

Соответствует ли оно вашему требованию?

-- TEST DATA
declare @my_date as date = '2018-05-20';

-- SOLUTION
with cte as (
select DATENAME(month,@my_date) name, CAST(1 as int) lvl
union all 
select DATENAME(month,dateadd(month,cte.lvl,@my_date)),cte.lvl + 1 from cte where cte.lvl <12
)
select name as [Month Name] from cte;
0 голосов
/ 05 октября 2018

Вы можете попробовать ниже путь

DECLARE 
        @DateFrom DATETIME = GETDATE(),
        @DateTo DATETIME =  DATEADD(month, 11,  GETDATE());

    WITH DateGenerate 
    AS (
        SELECT @DateFrom as MyDate
        UNION ALL
        SELECT DATEADD(month, 1, MyDate)
        FROM DateGenerate
        WHERE MyDate < @DateTo
       )

    SELECT 
        DATENAME(month, MyDate)
    FROM 
        DateGenerate;
0 голосов
/ 05 октября 2018

Вы можете попробовать использовать cte recursive.

Дата начала - сегодня, дата окончания - следующий год сегодня.

cte recursive Условие сравнивается при каждом добавлении один месяц.

Запрос 1 :

;WITH CTE(startDt,endDt) AS (
   SELECT  CAST('2018-05-20' AS DATE) startDt, DATEADD (year,1,'2018-05-20') endDt
   UNION ALL
   SELECT DATEADD(month,1,startDt) ,endDt
   FROM CTE
   WHERE DATEADD(month,1,startDt) < endDt
)
SELECT datename(month, startDt)
FROM CTE

Результаты :

|           |
|-----------|
|       May |
|      June |
|      July |
|    August |
| September |
|   October |
|  November |
|  December |
|   January |
|  February |
|     March |
|     April |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...