应用过滤器对季度数据求和

时间:2018-09-06 03:23:15

标签: sql-server

我希望过滤器用于汇总Quarterly数据。 对于Yearly数据,我添加了公式。

对于Quarterly数据,我现在已经进行了硬编码,但是需要让系统进行计算。

例如,下一个季度为Quarter 3,我需要计算当前年度/当前季度的数字(该季度3个月的总和)

SNIPPET过滤器代码

WHERE [Status] = 'Complete'
AND (YEAR([datefield]) = YEAR(GETDATE()) - 1
     OR YEAR([datefield]) = YEAR(GETDATE()) - 2
     OR YEAR([datefield]) = YEAR(GETDATE()) 
     AND MONTH([datefield]) IN(4, 5, 6)) --Apr/May/June.

1 个答案:

答案 0 :(得分:0)

很抱歉,提供的答案不完整。我回答后就想到了这一点。

SELECT *
FROM table
WHERE [Status] = 'Complete'
AND [datefield] BETWEEN CONVERT(date, DATEADD(M, -2, DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE())))
                AND EOMONTH(DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))

说明:

要使过滤器准确无误,您需要获取每月的第一天和最后一天。

第一天:

获取当前日期:

SELECT GETDATE()

  

2018-09-06 17:03:35.467

获取当前日期减去1

SELECT DATEADD(D, -1, GETDATE())

  

2018-09-05 17:03:35.467

将“当前日期减1”(上述结果)减去到当前日期。

SELECT DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE())

  

2018-09-01 17:03:35.467

仅获取日期部分:

SELECT CONVERT(date, DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))

  

2018-09-01

最后一天:

与获得第一天相同,但将CONVERT更改为EOMONTH,因为后者已经只返回date部分的结果

SELECT EOMONTH(DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))

  

2018-09-30

现在您拥有了

SELECT CONVERT(date, DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))
      ,EOMONTH(DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))
  

2018-09-01

     

2018-09-30

获取当前月份的前两个月。

SELECT CONVERT(date, DATEADD(M, -2, DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE())))

请注意,我刚刚在第一天值中添加了DATEADD(M, -2, )

组合2个月前的第一天和当月的最后一天

SELECT CONVERT(date, DATEADD(M, -2, DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE())))
      ,EOMONTH(DATEADD(D, -DAY(DATEADD(D, -1, GETDATE())), GETDATE()))
  

2018-07-01

     

2018-09-30