Последние 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~'
,