如何过滤我的结果,以便显示最近四个月的数据--sql

时间:2014-08-13 11:58:47

标签: sql sql-server

我尝试创建一个存储过程,从下面的查询中获取最近4个月的结果,但我不确定如何执行此操作。

这是我到目前为止所做的:

Declare @Number varchar(30) = '12'
Select
month = month(EndDate),
YEAR = YEAR(EndDate),
SUM(DownloadUnits) as downloads,
SUM(UploadUnits) as uploads,
number
from testTable
where number=@Number
GROUP BY MONTH(EndDate), Year(Enddate),number

如何将其过滤掉,以便在我通过月份参数(我还没有创建它)时过滤掉结果,这样它只显示过去四个月? (我已经硬编码了测试的数字参数)

3 个答案:

答案 0 :(得分:1)

从现在开始的最后N个月符合条件

where EndDate >= dateadd(month, -@DEDUCT_MONTHS, cast(getdate() as DATE))

删除cast会将当前时间强制为约束,而不是N个月前的午夜。

答案 1 :(得分:0)

如果你需要整整几个月,那么你需要在4个月前获得本月的第一个月。

您可以使用以下方式获取当月的第一个:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()), '19000101');

稍微调整一下将为您提供4个月前的第一个月:

SELECT DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) - 4, '19000101');

然后您可以将此过滤器应用于您的查询:

WHERE   EndDate >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) - 4, '19000101')

或者如果你需要传递一个参数的数量(顺便说一下它应该是INT而不是varchar):

WHERE   EndDate >= DATEADD(MONTH, DATEDIFF(MONTH, '19000101', GETDATE()) - @Number, '19000101')

如果您传递日期参数,只需将GETDATE()替换为您的参数名称。

答案 2 :(得分:0)

DECLARE @StartDate date
SET @StartDate=Dateadd(Month, Datediff(Month, 0, DATEADD(m, -6, getdate())), 0) 
--first day of the month, (current month-6 month)

上述脚本将在本月的第一天 - 6个月前返回。 这个解决方案来自stackoverflow某处,不幸的是我似乎没有找到原始帖子.. :(

要了解其工作原理,请尝试按以下方式进行反向工程:

DECLARE @StartDate1 date
SET @StartDate1= DATEADD(m, -6, getdate())
PRINT @Startdate1


DECLARE @StartDate2 int
SET @StartDate2= Datediff(Month, 0, DATEADD(m, -6, getdate()))
PRINT @Startdate2


DECLARE @StartDate3 date
SET @StartDate3=Dateadd(Month, 1369, 0)
PRINT @Startdate3