我有一张这样的桌子:
ID|Date |Name|Score
1 |1/1/2014|Erin|20.2
2 |6/3/2014|Erin|21.2
3 |7/2/2015|Emil|34.2
4 |1/1/2016|Erin|20.2
5 |2/2/2011|Paul|20.2
6 |1/1/2012|John|54.2
7 |1/1/2017|John|54.2
8 |12/31/2016|Erin|23.2
我希望根据我提供的年份将数据返回 5 年。
我正在使用这个:
select * from tblStdnt where date > DATEADD(Year,DATEDIFF(year,0, '2016')- 5, 0)
但这给了我从 2017 年开始的数据。我该如何解决这个问题?有任何想法吗?
它应该给我:
2011年至2016年的所有数据(5年期间,不分月日)
更新
DBFiddle 链接
你只需要使用DATEADD
dbfiddle在这里
更新
只要您需要两年之间的所有数据,您可以使用下一句话:
根据您的样本数据:
dbfiddle在这里
我相信您遇到的问题是您只指定了一个最短日期。根据您的查询的编写方式,您将获得从日期前五年到时间结束的所有内容。您需要指定范围的起点和终点,以消除指定日期之后出现的数据。一种写法是:
请注意,这个答案实际上给出了六年的数据——选择的年份和前五年。
1900
使用(“零”日期的年份)和0
(或“日期零”即)的“神奇”值,'1900-01-01'
我们可以生成我们需要的两年中的 1 月 1 日(5 年前和 1 年前):在最近的版本(2012+)中,使用该
DATEFROMPARTS(year, month, day)
功能更容易:注意:查询 - 因为条件针对列 (
date
) 而不是表达式 -可能*使用该列上的索引。具有列表达式条件的查询(如YEAR(date) >= ..
)不太可能使用索引,除非计算列上有具有特定表达式或类似索引视图的索引。* “may”:因为我们想要跨越 6 年的数据——所以可能是表的很大一部分——仍然可以使用表扫描。不过,使用类似的条件(“SARGable”)被认为是好的做法。考虑表的聚集索引是列或以
date
列开头的情况。该计划立即可以是部分扫描而不是表扫描。YEAR(date)
查询仍然需要进行全表扫描。如果它只是一个应该工作得很好的小数据集。对于较大的数据集,您可能会遇到语句不是 SARGable 的问题。