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

如何从SQL中的给定日期中获取前一个月的日期?,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我正在尝试从@EndDate获取一个月的日期,包括SQ Server 2008中提供的日期@EndDate @NoOfMonths是一个变量,它决定了我们需要多少前几个月的日期。 e、 g 预期结果将是: 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 结果:

我正在尝试从@EndDate获取一个月的日期,包括SQ Server 2008中提供的日期@EndDate

@NoOfMonths是一个变量,它决定了我们需要多少前几个月的日期。 e、 g

预期结果将是:

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
代码:


谢谢

我认为这应该满足您的要求:

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;

使用EOMOUNT函数:

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;

FYI,SQL Server 2008已经完全不支持超过一年了,您应该真正考虑升级更快,而不是更迟。您期望对@ EdDATE=2020—03-30和@ NoFo月=2的结果是什么?OP说:我正在尝试使用下面的递归CTE查询,但是结果不期望,我得到月末日期。使用EOMOUNT如何避免获得月末日期?
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;
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;