Сравнение скользящих недель - PullRequest
0 голосов
/ 01 ноября 2011

Я хочу сравнить данные за текущую неделю (с 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 одинаково.

Ответы [ 3 ]

1 голос
/ 01 ноября 2011

Похоже, что DateDiff лучше всего использовать здесь. Однако, как вы заметили, DATEFIRST действительно не соблюдается .

Итак, мы просто добавляем решение Ицик Бен-Гана , и мы получаем

 WHERE DATEDIFF (ww, 
    DATEADD( day, -@@DATEFIRST , @DateOpen),
    DATEADD( day, -@@DATEFIRST , @ImportDate)
    ) =2
1 голос
/ 01 ноября 2011

почему не просто DATEADD('dd', -14, DateOpen)?

0 голосов
/ 01 ноября 2011

Хотелось бы что-то вроде следующей работы сравнить годы?

WHERE ( DATEPART(ww,MA.DateOpen) + 1 ) % 52 = DATEPART(ww,@ImportDate) - 1
AND YEAR(MA.DateOpen)=YEAR(DATEADD(d, -14, @ImportDate))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...