如何从SQL中的给定日期获取一个月前的日期?

时间:2020-08-30 14:46:33

标签: sql sql-server tsql sql-server-2008

我正在尝试从@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;

谢谢!

2 个答案:

答案 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;