最近3个月的声明

时间:2014-01-02 13:24:42

标签: sql sql-server where rolling-computation

我有一个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月。我想知道如何调整声明以使其动态发生。

思想?

3 个答案:

答案 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)

有两种解决方案。

  • 修改当前的where语句并添加条件以检查此情况。
  • 使用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~'
)