【问题标题】:Last 3 Months Where Statement过去 3 个月 Where 声明
【发布时间】:2014-01-19 23:06:12
【问题描述】:

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

想法?

【问题讨论】:

  • 尝试使用DateAdd函数减少月数
  • 对于您使用的 RDBMS,查找日期函数而不是解析年份和月份,只需使用数据数学来减少 3 个月。

标签: sql sql-server where rolling-computation


【解决方案1】:

有两种解决方案。

  • 修改您当前的 where 语句并添加一个条件来检查这种情况。
  • 使用DATEADD函数。出现在 cmets 和其他答案中。

修改添加条件的位置

注意:可能存在小错误,因为我需要检查一月的月份值是零还是 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~'
)

【讨论】:

    【解决方案2】:

    我没有正在运行的 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 详细信息。

    【讨论】:

    • 我只是意识到这个解决方案有一点错误。我会用一个例子来解释它。如果请求的月份是 2014 年 1 月,您将获得 '2014/1/1' 和 '2013/11/1' 之间的活动,但活动必须在 '2014/1/31' 和 '2013/11/1' 之间.
    【解决方案3】:

    前段时间我也遇到过类似的问题。我的解决方案是这样的:

    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~' 的结果。

    【讨论】:

    • +1 太棒了!不确定与其他解决方案相比在速度方面如何,但还可以。
    • 谢谢!这对我来说效果很好而且速度很快,但实际上,当我使用它时,表格是两个字段,一个是月,另一个是年。我觉得这个案子也应该办好。
    猜你喜欢
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多