Последние 3 месяца, где заявление

У меня есть оператор SQL (SQL Server Management Studio), в который я передаю данные в оператор where с помощью программного обеспечения панели управления. Пользователи могут выбрать год (2013 или теперь 2014), а также месяц (который получает проходы в виде числового значения - таким образом, декабрь = 12). Мне нужно настроить утверждение так, чтобы я получал последние 3 месяца из года / месяца, который они выбрали. Раньше, б / к, оператор SQL имел дело только с данными за 2013 год, это было просто следующее:

YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between ('@Request.parmMonth~'-2) and '@Request.parmMonth~')

Обычно parmYear = 2013, а затем независимо от того, какой месяц они выберут, он будет захватывать за 2 месяца до текущего месяца.

Сейчас, б / с, сейчас январь 2014 года, мне нужно взять январь 2014 года + декабрь 2013 года + ноябрь 2013 года. Мне интересно, как изменить формулировку, чтобы это происходило динамически.

Мысли?

3 ответа

Решение

Есть два решения для этого.

  • Измените свой текущий оператор where и добавьте условие для проверки этого случая.
  • использование DATEADD функция. Присутствует в комментариях и других ответах.

Изменение вашего, где добавить условие

Примечание: возможна небольшая ошибка, так как мне нужно проверить, имеет ли январь значение месяца ноль или 1.

Пример:

WHERE 

(
'@Request.parmMonth~'-2 < 1 AND 
YEAR(Main.ActivityDate) = '@Request.parmYear~'-1 AND
Month(Main.ActivityDate) Between 
(12+'@Request.parmMonth~'-2) AND 12  
)
OR
(
YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between 
('@Request.parmMonth~'-2) and '@Request.parmMonth~'
)

У меня нет работающего экземпляра SQL Server для тестирования этого решения, но я бы предложил построить дату и использовать встроенные функции для вычисления предыдущей даты, поскольку они уже учитывают несколько лет и т. Д.

    Declare @requestDate date = DATEFROMPARTS('@Request.parmYear', '@Request.parmMonth', 1);
    ...

    AND Main.ActivityDate between @requestDate AND DATEADD(month, -2, @requestDate )

Смотрите это для более подробной информации.

У меня была похожая проблема некоторое время назад. Мое решение было что-то вроде этого:

WHERE YEAR(Main.ActivityDate)*12 + YEAR(Month(Main.ActivityDate))
   BETWEEN '@Request.parmYear~'*12+'@Request.parmMonth~'-2 
       AND '@Request.parmYear~'*12+'@Request.parmMonth~'

Вы можете улучшить это решение, отправив один параметр в результате '@Request.parmYear~'*12+'@Request.parmMonth~',

Другие вопросы по тегам