生成StartDate和EndDate之间的月份(SQL Server 2016)

生成StartDate和EndDate之间的月份(SQL Server 2016),sql,sql-server,sql-server-2016,Sql,Sql Server,Sql Server 2016,我有一个客户表,我需要生成活动日期和非活动日期之间的月份 以下是原始数据: 以下是我希望得到的结果: 谢谢您可以使用递归CTE: with yyyymm as ( select customerid, datefromparts(year(activedate), month(activedate), 1) as dte, datefromparts(year(inactivedate), month(inactivedat

我有一个客户表,我需要生成活动日期和非活动日期之间的月份

以下是原始数据:

以下是我希望得到的结果:


谢谢

您可以使用递归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

这会将结果生成为当月的第一个日期。如果您希望年/月值为字符串或数字,可以适当设置格式。

我对Gordon的脚本做了一些更改。很抱歉,我也是新成员,我无法添加评论。我相信这就是你想要的

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

这里的大多数人都希望样本数据和预期结果是格式化文本,而不是图像或图像链接。有一个包含所有可能月份的日历表。或者cte。外部连接。对不起,我不清楚。我没有顾客月台。这就是我所希望的结果。我需要生成活动日期和非活动日期之间的月份。因此,您可以检查Gordon的答案。