3

我有一个 SQL 语句(SQL Server Management Studio),我通过仪表板软件将数据传递到 where 语句中。用户可以选择年份(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 月。我想知道如何调整语句以使这种情况动态发生。

想法?

4

3 回答 3

3

我没有一个正在运行的 SQL Server 实例来测试这个解决方案,但我建议构建一个日期并使用内置函数来计算上一个日期,因为那些已经考虑了多年等。

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

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

有关更多详细信息,请参阅此内容。

于 2014-01-02T13:43:32.760 回答
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~'.

于 2014-01-02T13:48:24.603 回答
0

有两种解决方案。

  • 修改您当前的 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~'
)
于 2014-01-02T13:40:38.807 回答