我尝试创建一个存储过程,从下面的查询中获取最近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
如何将其过滤掉,以便在我通过月份参数(我还没有创建它)时过滤掉结果,这样它只显示过去四个月? (我已经硬编码了测试的数字参数)
答案 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