Я хочу сравнить данные за текущую неделю (с 1 по 52) с данными за две недели до этого. Мне нужно убедиться, что, когда новогодняя граница пересекается, сравнение продолжает работать. У меня есть рабочий предикат, например:
WHERE ( DATEPART(ww,MA.DateOpen) + 1 ) % 52 = DATEPART(ww,@ImportDate) - 1
Вышеприведенная логика работает, но она не учитывает ближайшие годы. Другими словами, в сравнение будут включены нежелательные данные за неделю 'X' всех предыдущих лет. Таким образом, предикат должен быть расширен для учета лет, что, в свою очередь, требует обработки границы нового года: 1-ю неделю 2012 года следует сравнить с 51-й неделей 2011 года.
Как это можно сделать без подробного предиката?
Обновление:
Этот вопрос осложняется необходимостью рассматривать «неделю года» как вторник-вторник. Моя текущая «правильная» попытка воплощена в случае [VerboseCheck] ниже.
SET DATEFIRST 2
DECLARE @ImportDate date = '2011-1-4'
DECLARE @DateOpen date = '2010-12-20'
select @ImportDate,
YEAR(@DateOpen),
DATEPART(ww, @DateOpen),
YEAR(DATEADD(dd,-14,@ImportDate)),
DATEPART(ww,DATEADD(dd,-14,@ImportDate)),
CASE WHEN
YEAR(@DateOpen) + DATEPART(ww, @DateOpen) =
YEAR(DATEADD(dd,-14,@ImportDate)) + DATEPART(ww,DATEADD(dd,-14,@ImportDate))
THEN 1 ELSE 0 END [VerboseCheck],
CASE WHEN DATEDIFF (ww, @DateOpen, @ImportDate) =2
THEN 1 ELSE 0 END [SimpleCheck]
[SimpleCheck] был бы идеальным, но он дает другой ответ, чем [VerboseCheck]. Если я продвигаю @DateOpen еще один день, то оба дают одинаковый ответ. Это говорит о том, что оба не соблюдают оценку DATEFIRST одинаково.