我正在尝试从@EndDate
中获取一个月的日期,包括SQ Server 2008中提供的日期(@EndDate
)。
@NoOfMonths
是一个变量,它确定我们需要多少个月的日期。
例如
@EndDate = 2020-07-28
@NoOfMonths = 6
预期结果将是:
2020-07-28
2020-06-28
2020-05-28
2020-04-28
2020-03-28
2020-02-28
我正在尝试使用下面的递归CTE查询,但是结果没有预期,我得到了月底日期。
@EndDate: 2020-07-28
@NoOfMonths = 6
结果:
2020-07-31
2020-06-30
2020-05-31
2020-04-30
2020-03-31
2020-02-29
代码:
DECLARE @EndDate DATE = CAST('2020 - 07 - 28' AS DATE);
DECLARE @NoOfMonths INT = 6;
WITH CTE_previousMonths AS
(
SELECT
CAST(DATEADD(ss, -1, DATEADD(mm, DATEDIFF(m, -1, @EndDate), 0)) AS DATE) AS MonthPriorDate,
1 AS months
UNION ALL
SELECT
CAST(DATEADD(ss, -1, DATEADD(mm, DATEDIFF(m, 0, MonthPriorDate), 0)) AS DATE) AS MonthPriorDate,
months + 1 AS months
FROM
CTE_previousMonths
WHERE
months < @NoOfMonths
)
SELECT CTE_previousMonths.MonthPriorDate
FROM CTE_previousMonths;
谢谢!
答案 0 :(得分:2)
我认为这应该做您想要的:
with n as (
select 1 as n
union all
select n + 1
from n
where n < @NoOfMonths
)
select dateadd(month, 1 - n, @enddate)
from n;
答案 1 :(得分:0)
使用Eomonth函数:
WITH cte1 as
(
select EOMONTH('2020-07-28') as last_date, DATEADD(MONTH, -5, EOMONTH('2020-07-28')) AS END_DATE--Number of months - 1
union all
select DATEADD(MONTH, -1, last_date), END_DATE FROM CTE1 WHERE LAST_DATE > END_DATE
)
SELECT last_date FROM cte1;