【问题标题】:How to filter my results so it shows the last four months of data - sql如何过滤我的结果以显示最近四个月的数据 - sql
【发布时间】:2014-08-13 20:47:01
【问题描述】:

我正在尝试创建一个存储过程,该过程可以从以下查询中获取最近 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

如何过滤掉它,这样当我传递月份参数(我还没有创建它)时,它会过滤掉结果,只显示过去四个月? (我已经硬编码了 number 参数进行测试)

【问题讨论】:

  • 月份参数中有什么?在这种情况下是 4 还是要从中减去 4 的月份数?
  • 要减去 4 的月份数。假装它的一月(1)我需要撤回 12,11,10 所以我需要使用年和月
  • @user3884462:那么你将作为参数传递什么。日期值?因为仅仅过了一个月是不够的!
  • 我建议将@Number varchar(30) 更改为@YearMonth char(7) 并传入像'2014-01' 这样的值。它会给你更多的灵活性。更好的是,传入年份和月份的数值。

标签: sql sql-server


【解决方案1】:

从现在开始的最后N个月满足条件

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

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

【讨论】:

  • 因此,如果我输入 -4 而不是 @Deduct_months,这将为我提供过去四个月的数据
【解决方案2】:

如果您需要获得整月,那么您需要获得 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() 替换为您的参数名称即可。

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 2017-06-17
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2011-09-23
      相关资源
      最近更新 更多