如何在SQL中获取前几个季度的数据

时间:2018-07-24 12:14:10

标签: sql tsql

我有一张桌子。

表1

Id  Sid Date    Value
3   25  31-Oct-16   12
3   25  30-Nov-16   13
3   25  31-Dec-16   14
3   25  31-Jan-17   15
3   25  28-Feb-17   16
3   25  31-Mar-17   17
3   25  30-Apr-17   18
3   25  31-May-17   19
3   25  30-Jun-17   20
3   25  31-Jul-17   21
3   25  31-Aug-17   22
3   25  30-Sep-17   23
3   25  31-Oct-17   24
3   25  30-Nov-17   25
3   25  31-Dec-17   26
3   25  31-Jan-18   27
3   25  28-Feb-18   28
3   25  31-Mar-18   29
3   25  30-Apr-18   30
3   25  31-May-18   31
3   25  30-Jun-18   32

我正在尝试获取以下七个季度的数据:

Id  Sid Date    Value
3   25  31-Dec-16   14
3   25  31-Mar-17   17
3   25  30-Jun-17   20
3   25  30-Sep-17   23
3   25  31-Dec-17   26
3   25  31-Mar-18   29
3   25  30-Jun-18   32

我正在尝试使用 DATEADD DATEDIFF 函数,但是没有得到预期的结果。下面是查询:

SELECT * 
FROM Table1 
WHERE Date BETWEEN DATEADD(qq, DATEDIFF(qq, 0, GETDATE()) -7, 0) AND GETDATE()

有任何提示或想法吗?

谢谢!

4 个答案:

答案 0 :(得分:0)

这可以解决问题-可能不是最优雅的方法,但是应该可以。

itertools.permutations

答案 1 :(得分:0)

尝试一下

   A  B    C    D
0  1  2  3.0  NaN
1  1  2  3.0  4.0
2  6  7  NaN  NaN

答案 2 :(得分:0)

select * from table1 where datepart(mm,date) in (3,6,9,12)

答案 3 :(得分:0)

我真的不知道您需要什么,也没有告诉我们您使用的版本。

此代码将使用几乎所有版本中可用的函数从不同的输入计算一些相关的值。

更高版本允许EOMONTHDATEFROMPARTSFORMAT ...
Read this and follow the links

而且-如评论中所述-您应该引入日期和数字表。

只提供一个想法:

DECLARE @tblDates TABLE(dt DATE);
INSERT INTO @tblDates VALUES(GETDATE()),({d'2018-01-01'})
                                       ,({d'2018-03-31'})
                                       ,({d'2018-04-30'})
                                       ,({d'2018-05-17'})
                                       ,({d'2018-11-30'})
                                       ,({d'2018-12-31'});
select *
FROM @tblDates dts
CROSS APPLY(SELECT CONVERT(DATE,CAST(Year(dt) AS CHAR(4)) + '-' + REPLACE(STR(MONTH(dt),2),' ','0') + '-01',126)) A(FirstOfMonth)
CROSS APPLY(SELECT DATEADD(MONTH,(-1)*(MONTH(A.FirstOfMonth)-1)%3,A.FirstOfMonth)) B(FirstOfQuarter)
CROSS APPLY(SELECT DATEADD(QQ,-7,B.FirstOfQuarter)) C(SevenQuartersBack);

结果:

dt          FoM         FoQ         SevenQuartersBack
2018-07-24  2018-07-01  2018-07-01  2016-10-01
2018-01-01  2018-01-01  2018-01-01  2016-04-01
2018-03-31  2018-03-01  2018-01-01  2016-04-01
2018-04-30  2018-04-01  2018-04-01  2016-07-01
2018-05-17  2018-05-01  2018-04-01  2016-07-01
2018-11-30  2018-11-01  2018-10-01  2017-01-01
2018-12-31  2018-12-01  2018-10-01  2017-01-01