Sql 最近3个月的报表
我有一个SQL语句(SQLServerManagementStudio),通过仪表板软件将数据传递到where语句中。用户可以选择年份(2013年或现在的2014年)和月份(以数值形式传递-因此12月=12)。我需要调整报表,使其符合我从他们选择的年份/月份中获得的最后3个月的位置。以前,b/c SQL语句只处理2013年的数据,它只是如下所示:Sql 最近3个月的报表,sql,sql-server,where,rolling-computation,Sql,Sql Server,Where,Rolling Computation,我有一个SQL语句(SQLServerManagementStudio),通过仪表板软件将数据传递到where语句中。用户可以选择年份(2013年或现在的2014年)和月份(以数值形式传递-因此12月=12)。我需要调整报表,使其符合我从他们选择的年份/月份中获得的最后3个月的位置。以前,b/c SQL语句只处理2013年的数据,它只是如下所示: YEAR(Main.ActivityDate) = '@Request.parmYear~' AND (Month(Main.ActivityDate
YEAR(Main.ActivityDate) = '@Request.parmYear~'
AND (Month(Main.ActivityDate) Between ('@Request.parmMonth~'-2) and '@Request.parmMonth~')
通常情况下,parmYear=2013,然后无论他们选择哪个月,它都会在当前月份之前2个月
现在是2014年1月,我需要抓取2014年1月+2013年12月+2013年11月。我想知道如何调整语句以使其动态发生
想法?有两种解决方案
- 修改当前where语句并添加条件以检查此情况
- 使用
函数。在评论和其他答案中呈现DATEADD
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~'
)
在哪里
(
“@Request.parmonth~”-2<1和
年份(Main.ActivityDate)='@Request.parmYear~'-1和
月份(主要活动日期)介于
(12+'@Request.parmonth~'-2)和12
)
或
(
年份(Main.ActivityDate)='@Request.parmYear~'
和(月(主要活动日期)之间
(“@Request.parmonth~”-2)和“@Request.parmonth~”
)
我没有正在运行的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.parmonth~'
的结果发送给您。尝试使用DateAdd函数来减少您正在使用的RDBMS的月数,查找日期函数而不是解析年份和月份,只需使用数据数学来减少3个月即可。+1太棒了!不确定sp我知道这与其他解决方案相比如何,但还行。谢谢!这对我来说非常有效,速度也很快,但实际上,当我使用它时,表格是两个字段,一个是月份,另一个是年份。我认为这个案例也应该很有效。我只是意识到这个解决方案有一点错误。我会用一个例子来解释。如果月份要求,我会s 2014年1月,您将获得介于“2014/1/1”和“2013/11/1”之间的活动,但活动必须介于“2014/1/31”和“2013/11/1”之间。