SQL Server找到过去2个月的最后一周

-3 sql sql-server sql-server-2008

INSERT INTO @blah (ID, Date)
    VALUES (123, '11/12/2012')
    VALUES (124, '11/30/2012')
    VALUES (125, '11/28/2012')
    VALUES (126, '12/1/2012')
    VALUES (127, '12/30/2012')
    VALUES (128, '12/25/2012')
    VALUES (129, '12/26/2012')
Run Code Online (Sandbox Code Playgroud)

我希望获得行,其中日期是相应月份的最后一周,可以追溯到两个月.这个月是2013年1月,所以我想要2012年12月和2012年11月的最后一周.

最终的选择是一个月的最后一周例子:2012年12月= 12/23-12/29但是现在生病在这个月的最后7天.

我知道如何获得最近两个月但不确定如何获得相应月份的最后一周..

select
    *
from
    @blah
where
    dateDiff(month,date,getdate()) < 2 ---only look at the last two months
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

这符合规定的要求(前两个月的最后一周):

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);
Run Code Online (Sandbox Code Playgroud)

为了使这更具活力(你应该尽力说明这些要求,而不是在人们投入大量工作之后),你可以说:

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);
Run Code Online (Sandbox Code Playgroud)

请不要让任何人说服您使用LIKE日期比较查询.这不仅会破坏sargability(意味着不能使用索引),但是,对于这样的问题,您如何确定要匹配的字符串模式?困难不在于构建WHERE条款,而在于为魔术(Your Dates go here)占位符填写什么.当你找到日期范围时,你真的想要14个单独的LIKE表达吗?我不会.