在SQL中使用Enddate生成从月份(日期)到Enddates的日期

在SQL中使用Enddate生成从月份(日期)到Enddates的日期,sql,sql-server,date,Sql,Sql Server,Date,我的表格如下: |-------------------------| |ID | Enddate | MRR(£)| |-------------------------| | 1 | 2020-05-10 | 100 | | 2 | 2021-01-01 | 120 | | 3 | 2020-10-10 | 50 | | 4 | 2020-05-02 | 80 | | 5 | 2020-12-30 | 150 | |-----------------

我的表格如下:

|-------------------------|
|ID  | Enddate    | MRR(£)|
|-------------------------|
| 1  | 2020-05-10 | 100   |
| 2  | 2021-01-01 | 120   |
| 3  | 2020-10-10 |  50   |
| 4  | 2020-05-02 |  80   |
| 5  | 2020-12-30 | 150   |
|-------------------------|
我想从上面的表生成返回ID、Enddate、MRR和Month,如图所示

|------------------------------------|
|ID  | Enddate    | MRR(£)| Month    |
|------------------------------------|
| 1  | 2020-05-10 | 100   | NULL     |
| 2  | 2021-01-01 | 120   |2020-06-01|
| 2  | 2021-01-01 | 120   |2020-07-01|
| 2  | 2021-01-01 | 120   |2020-08-01|
| 2  | 2021-01-01 | 120   |2020-09-01|
| 2  | 2021-01-01 | 120   |2020-10-01|
| 2  | 2021-01-01 | 120   |2020-11-01|
| 2  | 2021-01-01 | 120   |2020-12-01|
| 2  | 2021-01-01 | 120   |2021-01-01|
| 3  | 2020-10-10 |  50   |2020-06-01|
| 3  | 2020-10-10 |  50   |2020-07-01|
| 3  | 2020-10-10 |  50   |2020-08-01|
| 3  | 2020-10-10 |  50   |2020-09-01|
| 3  | 2020-10-10 |  50   |2020-10-01|
| 4  | 2020-05-02 |  80   | NULL     |
| 5  | 2020-12-30 | 150   |2020-06-01|
| 5  | 2020-12-30 | 150   |2020-07-01|
| 5  | 2020-12-30 | 150   |2020-08-01|
| 5  | 2020-12-30 | 150   |2020-09-01|
| 5  | 2020-12-30 | 150   |2020-10-01|
| 5  | 2020-12-30 | 150   |2020-11-01|
| 5  | 2020-12-30 | 150   |2020-12-01|
|------------------------------------|
请注意,示例ID=2的月份列包含截至enddate的下一个月。 这同样适用于ID 3和5。然而,ID 1和4为空,因为我们在2020年5月,它被跳过,因为enddate没有未来的日期

我自己写了一个代码,但我没有弄好,所以我需要帮助

SELECT  DATEADD(DAY, nbr - 1, /Start Date/Convert(date,Dateadd(dd,1 - DATEPART(dd,getdate()), DATEADD(mm,1,getdate())),103)) AS Dates
FROM    
( SELECT ROW_NUMBER() OVER ( ORDER BY c.object_id ) AS Nbr
  FROM sys.columns c  
 ) nbrs
WHERE nbr - 1 <= DATEDIFF(DAY, 
       /**Start Date**/
Convert(date,Dateadd(dd,1 - DATEPART(dd,getdate()), DATEADD(mm,1,getdate())),103), 
/**End Date**/
(SELECT enddate from TestTim.[dbo].[OrderTable] where enddate >= cast(getdate() as Date) and ID = 5))
这是我的密码。但它只适用于ID=5,但我不知道如何添加ID、Enddate和MRR。对于其他ID,它不是动态的


/结束日期/和/开始日期/显示表示其后的代码

您可以使用递归CTE生成日期列表,查找下个月的第一天,然后添加一个月,直到结束日期:


输出太长,无法在此显示,但符合要求

考虑处理应用程序代码中的数据显示问题,并找出您使用的是哪种RDBMS。它适用于表中的几行,但对于许多行,我收到错误消息:语句终止。在语句完成之前,已耗尽最大递归100。我该怎么办?@Tim您可以将递归限制提高到32767,或者将其设置为0表示无限制;看。@Tim。问题不在于表中的行数,而在于在某些情况下,您需要生成超过100个月的数据—超过递归限制。这是超过12年的时间,所以这是一个很长的时间。
WITH CTE AS (
  SELECT ID, Enddate, [MRR(£)], 
         CASE WHEN Enddate <= EOMONTH(GETDATE()) THEN NULL
              ELSE DATEADD(DAY, 1, EOMONTH(GETDATE()))
         END AS Month
  FROM data
  UNION ALL
  SELECT ID, Enddate, [MRR(£)], DATEADD(MONTH, 1, Month)
  FROM CTE
  WHERE DATEADD(MONTH, 1, Month) <= Enddate
)
SELECT *
FROM CTE
ORDER BY ID, Month