如何获取截至今天的最近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())
但这只给了我上个月。
答案 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);