これは、指定された要件(過去2か月の最後の丸1週間)を満たしています。
SET DATEFIRST 1;
DECLARE @s DATE = GETDATE(), @s1 DATE, @s2 DATE;
SET @s = GETDATE();
-- last day of last month:
SET @s1 = DATEADD(DAY, -DAY(@s), @s);
-- last day of previous month:
SET @s = DATEADD(MONTH, -1, @s);
SET @s2 = DATEADD(DAY, -DAY(@s), @s);
SELECT
@s1 = DATEADD(DAY, -7, DATEADD(DAY, -DATEPART(WEEKDAY, @s1) % 7, @s1)),
@s2 = DATEADD(DAY, -7, DATEADD(DAY, -DATEPART(WEEKDAY, @s2) % 7, @s2));
SELECT col1, col2, etc.
FROM dbo.table
WHERE
(date_column >= @s1 AND date_column < DATEADD(DAY, 7, @s1)
OR
(date_column >= @s2 AND date_column < DATEADD(DAY, 7, @s2);
これをより動的にするために(人々がたくさんの仕事をした後ではなく、最初にこれらの要件を述べるために最善を尽くす必要があります)、あなたは言うことができます:
DECLARE @NumberOfMonthsIReallyWanted INT = 3;
DECLARE @i INT = 1, @d DATE = GETDATE();
DECLARE @t TABLE(d DATE);
WHILE @i <= @NumberOfMonthsIReallyWanted
BEGIN
SET @d = DATEADD(MONTH, -@i, @d)
INSERT @t(s) SELECT DATEADD(DAY, -7, DATEADD(DAY,
-DATEPART(WEEKDAY, DATEADD(DAY, -DAY(@d), @d)) % 7,
DATEADD(DAY, -DAY(@d), @d)));
SET @i += 1;
END
SELECT src.col1, src.col2, etc.
FROM dbo.table AS src
INNER JOIN @t AS t
ON src.date_column >= t.d AND src.date_column < DATEADD(DAY, 7, t.d);
LIKE
日付比較クエリに使用するようにだれにも説得させないでください。これはsargability(インデックスを使用できないことを意味します)を殺すだけでなく、このような問題の場合、どの文字列パターンに一致するかをどのように決定しますか?難しいのは、条項を作成することではなく、魔法のプレースホルダーWHERE
に何を入力するかです。(Your Dates go here)
そして、日付の範囲を見つけたとき、本当に14の個別のLIKE
表現が必要ですか?私はしません。