我有一张桌子。
表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()
有任何提示或想法吗?
谢谢!
答案 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)
我真的不知道您需要什么,也没有告诉我们您使用的版本。
此代码将使用几乎所有版本中可用的函数从不同的输入计算一些相关的值。
更高版本允许EOMONTH
,DATEFROMPARTS
,FORMAT
...
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