我有一个SQL语句(SQL Server Management Studio),我通过仪表板软件将数据传入where-statement。用户可以选择年份(2013年或现在的2014年)以及月份(将通过作为数值 - 因此12月= 12)。我需要将声明调整到我从他们选择的年/月开始的最后3个月。之前,b / c SQL语句只处理2013数据,它只是以下内容:
YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between ('@Request.parmMonth~'-2) and '@Request.parmMonth~')
通常情况下,parmYear = 2013,然后在他们选择的任何月份,它将在当月之前的2个月内获得。
现在,b / c是2014年1月,我需要抓住2014年1月+ 2013年12月+ 2013年11月。我想知道如何调整声明以使其动态发生。
思想?
答案 0 :(得分:3)
我没有运行SQL Server实例来测试此解决方案,但我建议构建一个日期并使用内置函数计算之前的日期,因为那些已经考虑了多年等等。
Declare @requestDate date = DATEFROMPARTS('@Request.parmYear', '@Request.parmMonth', 1);
...
AND Main.ActivityDate between @requestDate AND DATEADD(month, -2, @requestDate )
See this for more详细信息。
答案 1 :(得分:1)
前段时间我遇到过类似的问题。我的解决方案是这样的:
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~'
。
答案 2 :(得分:0)
有两种解决方案。
DATEADD
功能。在评论和其他答案中提出。修改添加条件的位置
注意:可能存在轻微错误,因为我需要检查1月份的月值是零还是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~'
)