Генерация месяцев между StartDate и EndDate (SQL Server 2016) - PullRequest
0 голосов
/ 14 ноября 2018

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

Вот необработанные данные:

Here's the raw data:

Вотвыходной я надеюсь на:

Here's the output I am hoping for:

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Я внес некоторые изменения в скрипт Гордона (извините, я тоже новый участник, я не могу добавлять комментарии).Я считаю, что это то, что вы хотите.

WITH Cus AS 
(
    select CustomerId   
            ,DATEFROMPARTS(YEAR(ActiveDate),MONTH(ActiveDate), 1) as ActiveDate
            ,DATEFROMPARTS(YEAR(InactiveDate),MONTH(InactiveDate), 1) as InactiveDate
    FROM Customer
) 
SELECT * 
FROM Cus C
INNER JOIN CustomerMonths CM ON C.CustomerId = CM.CustomerId
WHERE DATEFROMPARTS(LEFT(CM.MONTHS,4),RIGHT(CM.MONTHS,2),1) BETWEEN C.ActiveDate AND C.InactiveDate
0 голосов
/ 14 ноября 2018

Вы можете использовать рекурсивный CTE:

    with yyyymm as (
      select customerid,
             datefromparts(year(activedate), month(activedate), 1) as dte,
             datefromparts(year(inactivedate), month(inactivedate), 1) as inactivemonth
      from Customer
      union all
      select customerid,
             dateadd(month, 1, dte),
             inactivemonth
      from yyyymm
      where dte < inactivemonth
     )
select CustomerId, year(dte) * 100 + month(dte)
from yyyymm
order by dte

. Результатом будет первая дата месяца.Если вы хотите, чтобы значение года / месяца было строкой или числом, вы можете отформатировать его соответствующим образом.

...