Tenho uma tabela assim:
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
Quero os dados de volta 5 anos com base no ano que forneço.
Estou usando isso:
select * from tblStdnt where date > DATEADD(Year,DATEDIFF(year,0, '2016')- 5, 0)
Mas isso me dá dados a partir de 2017. Como faço para corrigir isso? alguma ideia?
Deve dar-me:
todos os dados de 2011 a 2016 (o período de 5 anos, independentemente do mês ou dia)
ATUALIZE
o link do DBFiddle
Você só precisa usar DATEADD
dbfiddle aqui
ATUALIZAR
Na medida em que você precisa de todos os dados entre dois anos, você pode usar a próxima frase:
De acordo com seus dados de amostra:
dbfiddle aqui
Acredito que o problema que você está enfrentando é que você está apenas especificando uma data mínima. A forma como sua consulta é escrita, você obterá tudo de cinco anos antes da data até o fim dos tempos. Você precisa especificar um ponto inicial e final para seu intervalo para eliminar os dados que ocorrem após a data especificada. Uma maneira de escrever isso seria:
Observe que esta resposta na verdade fornece seis anos completos de dados - o ano selecionado e os cinco anos anteriores.
Usando os valores "mágicos" de
1900
(o ano da data "zero") e0
(ou "data zero" que é'1900-01-01'
) podemos produzir o 1º de janeiro dos dois anos que precisamos (5 anos atrás e 1 ano adiante):Nas versões recentes (2012+), é mais fácil com a
DATEFROMPARTS(year, month, day)
função:Nota: a consulta - porque a condição é contra a coluna (
date
) e não sobre uma expressão - pode * usar um índice nessa coluna. É improvável que as consultas que tenham condições com expressões nas colunas (comoYEAR(date) >= ..
) usem um índice, a menos que haja um índice em uma coluna computada com a expressão específica ou uma exibição indexada semelhante.* "may": Como queremos dados que abrangem 6 anos - provavelmente uma grande parte da tabela - uma varredura de tabela ainda pode ser usada. O uso de condições semelhantes ("SARGable") é considerado uma boa prática. Considere o caso em que o índice clusterizado da tabela é ou começa com a
date
coluna. Imediatamente o plano pode ser uma varredura parcial em vez de uma varredura de tabela. AsYEAR(date)
consultas ainda terão que fazer uma varredura completa da tabela.Se for apenas um pequeno conjunto de dados que deve funcionar bem o suficiente. Para conjuntos de dados maiores, você pode encontrar problemas com a declaração não ser SARGable.