1 か月を減算し、その月の追加が現在の日付を超えない最大 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
...等。
編集:
上記の回答は、それを CTE にラップしてから、元のクエリに簡単な方法で結合することで適用できます。インライン関数呼び出しはクエリ全体で常に 4 行に制限されるため、日付関数のパフォーマンスへの影響は無視できることに注意してください。
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