Respostas:
O seguinte adiciona -1 ano à data atual:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Encontrei esta página enquanto procurava uma solução que me ajudasse a selecionar os resultados de um ano anterior. A maioria dos resultados mostrados acima parece retornar itens dos últimos 365 dias, o que não funcionou para mim.
Ao mesmo tempo, ele me deu orientação suficiente para resolver minhas necessidades no código a seguir - que estou postando aqui para qualquer outra pessoa que tenha a mesma necessidade que a minha e que possa encontrar esta página em busca de uma solução.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Agradeço àqueles acima cujas soluções me ajudaram a chegar ao que eu precisava.
Bem, eu acho que algo está faltando aqui. O usuário deseja obter dados do ano passado e não dos últimos 365 dias. Existe uma grande diferença. Na minha opinião, os dados do ano passado são todos os dados de 2007 (se eu estiver em 2008 agora). Portanto, a resposta certa seria:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Então, se você quiser restringir esta consulta, pode adicionar algum outro filtro, mas sempre pesquisando no último ano.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
O mais legível, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Qual:
Existem variantes com DATEDIFF e DATEADD para obter a meia-noite de hoje, mas tendem a ser um tanto obtusas (embora ligeiramente melhores no desempenho - não que você notaria em comparação com as leituras necessárias para obter os dados).
GETDATE () retorna a data e hora atuais .
Se o ano passado começar à meia-noite do dia atual do ano passado (como no exemplo original), você deve usar algo como:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
As outras sugestões são boas se você tiver "somente SQL".
No entanto, sugiro que - se possível - você calcule a data em seu programa e insira-a como string na consulta SQL.
Pelo menos para tabelas grandes (ou seja, vários milhões de linhas, talvez combinadas com junções), isso proporcionará uma melhoria considerável na velocidade, já que o otimizador pode trabalhar muito melhor com isso.
argumento para a função DATEADD:
DATEADD (*datepart* , *number* , *date* )
parte da data pode ser: aa, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
número é uma expressão que pode ser resolvida para um int que é adicionado a uma parte da data
data é uma expressão que pode ser resolvida para um valor de hora, data, smalldatetime, datetime, datetime2 ou datetimeoffset.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
Eu, como @DE White, vim aqui por razões semelhantes, mas diferentes da pergunta original. A pergunta original diz respeito aos últimos 365 dias. A resposta de @samjudson fornece isso. A resposta de @DE White retorna os resultados do ano anterior.
Minha consulta é um pouco diferente porque funciona para o ano anterior e inclui a data atual:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Por exemplo, em 17 de fevereiro de 2017, esta consulta retorna resultados de 01/01/2016 a 17/02/2017
Tive um problema semelhante, mas o codificador anterior fornecia apenas a data no formato mm-aaaa. Minha solução é simples, mas pode ser útil para alguns (eu também queria ter certeza de que os espaços iniciais e finais foram eliminados):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())
Por alguma razão, nenhum dos resultados acima funcionou para mim.
Isso seleciona os últimos 365 dias.
SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()