减去一个月并包括从最多 4 天的范围内的每一天,其中添加的月份不超过当前日期。
DECLARE @Today DATE = '2/28/2013';
SELECT [Current] = @Today, [MonthAgo] = DATEADD(DAY,t.v,DATEADD(MONTH,-1,@Today))
FROM (VALUES(0),(1),(2),(3)) as t(v)
WHERE DATEADD(MONTH,1,DATEADD(DAY,t.v,DATEADD(MONTH,-1,@Today))) <= @Today;
2013 年 2 月 28 日的结果:
Current MonthAgo
---------- ----------
2013-02-28 2013-01-28
2013-02-28 2013-01-29
2013-02-28 2013-01-30
2013-02-28 2013-01-31
2013 年 3 月 27 日的结果:
Current MonthAgo
---------- ----------
2013-03-27 2013-02-27
2013 年 4 月 30 日的结果:
Current MonthAgo
---------- ----------
2013-04-30 2013-03-30
2013-04-30 2013-03-31
...ETC。
编辑:
我的上述答案可以通过将其包装到 CTE 中,然后以直接的方式加入您的原始查询来应用。请注意,对于整个查询,内联函数调用始终限制为四行,因此日期函数的性能影响应该可以忽略不计:
DECLARE @Today DATE = GETDATE();
; WITH CTE AS (
SELECT [Current] = @Today, [MonthAgo] = DATEADD(DAY,t.v,DATEADD(MONTH,-1,@Today))
FROM (VALUES(0),(1),(2),(3)) as t(v)
WHERE DATEADD(MONTH,1,DATEADD(DAY,t.v,DATEADD(MONTH,-1,@Today))) <= @Today
)
SELECT [User Id],[Sign Up Date]
FROM [Monthly Account Update]
JOIN CTE ON CTE.[MonthAgo] = [Sign Up Date];
GO