在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