减去一个月,并包括最多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
结果为二零一三年四月三十零日:
Current MonthAgo
---------- ----------
2013-04-30 2013-03-30
2013-04-30 2013-03-31
...等。
编辑:
我上面的回答可以用它包装成一个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
什么的,而不是每月的第一个(或15日)? – 2013-03-28 02:38:59