我如何获得今天的最后12个月的日期?

时间:2020-10-21 23:08:08

标签: sql sql-server tsql datetime recursive-query

如何获取截至今天的最近12个月的日期?

例如:

2020-10-21
2020-09-21
2020-08-21
2020-07-21
2020-06-21
2020-05-21
2020-04-21
2020-03-21
2020-02-21
2020-01-21

我尝试过这个:

SELECT GETDATE() 'Today', 
           DATEADD(mm,-1,GETDATE())

但这只给了我上个月。

4 个答案:

答案 0 :(得分:2)

如果要生成这些行,则可以使用递归查询:

with cte as (
    select 0 n
    union all select n + 1 from cte where n < 12
)
select dateadd(month, -n, convert(date, getdate())) dt from cte order by dt

这将为您提供今天的日期以及前12个月的每月的同一天(因此共有13行)。您可以将cte中的不等式条件调整为所需的确切迭代次数。如果您需要进行100次以上的迭代,则需要在查询末尾添加option (maxrecursion 0)

答案 1 :(得分:1)

您可以使用递归CTE,但有时会对性能产生负面影响。如果这里没有可用的数字表,则可以使用系统表来生成行,并使用ROW_NUMBER()窗口函数为它们提供数字1..12,如下所示:

select top 12 dateadd(month, 1-row_number() over (order by (select null)), getdate()) 
  from sys.all_objects

Working example on dbfiddle.uk, both recursive and with the above

答案 2 :(得分:0)

various ways生成1到12之间的数字序列。选择一个。有了序列后,您只需要向其添加DATEADD,例如像这样:

SELECT DISTINCT
DATEADD(MONTH, 0-Number, GETDATE())
FROM master.dbo.spt_values
WHERE Number BETWEEN 1 AND 12

答案 3 :(得分:0)

在我看来,在这里使用内联计数似乎很简单:

SELECT DATEADD(MONTH,T.I,V.[Date])
FROM (VALUES(CONVERT(date,GETDATE())))V([Date])
     CROSS APPLY (VALUES(0),(-1),(-2),(-3),(-4),(-5),(-6),(-7),(-8),(-9),(-10),(-11))T(I);