SQL Server:Obter dados apenas para o ano passado
-
09-06-2019 - |
Pergunta
Eu estou escrevendo uma consulta na qual eu tenho que pegar os dados apenas para o último ano.Qual é a melhor maneira de fazer isso?
SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
Solução
A seguir adiciona -1 anos para a data atual:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Outras dicas
Eu encontrei esta página, enquanto procura uma solução que iria me ajudar a seleccionar os resultados de um ano anterior.A maioria dos resultados apresentados acima parece retornar os itens dos últimos 365 dias, o que não funcionou para mim.
Ao mesmo tempo, ele me deu o suficiente direção para resolver minhas necessidades no código a seguir, que eu estou postando aqui para quaisquer outras pessoas que tenham a mesma necessidade de minas e que pode vir através desta página em busca de uma solução.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Obrigado a todos aqueles acima cujas soluções ajudou-me a chegar ao que eu precisava.
Bem, acho que algo está faltando aqui.Usuário deseja obter dados a partir do último ano e não dos últimos 365 dias.Há uma enorme diferença.Na minha opinião, os dados do ano passado, todos os dados de 2007 (se eu estiver em 2008).Portanto, a resposta certa seria:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Então, se você deseja restringir essa consulta, você pode adicionar outro filtro, mas sempre em busca do último ano.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
Procurar dateadd em BOL
dateadd(yy,-1,getdate())
O mais legível, IMO:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
O que:
- Fica agora é datetime GETDATE() = #8/27/2008 10:23am#
- Converte para uma string com o formato de 101 CONVERT(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
- Converte uma data e hora CONVERTER(datetime, '8/27/2007') = #8/27/2008 12:00#
- Subtrai 1 ano DATEADD(aa, -1, #8/27/2008 12:00#) = #8/27/2007 12:00 AM#
Há variantes com DATEDIFF e DATEADD para chegar a meia-noite de hoje, mas eles tendem a ser bastante obtuso (embora ligeiramente melhor em desempenho - não que você gostaria de aviso prévio em comparação ao lê necessário para obter os dados).
GETDATE() retorna a data atual e o tempo.
Se no ano passado começa na meia-noite do dia corrente 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
Outras sugestões são boas se você tem "SQL só".
No entanto, eu sugiro, que - se possível - você calcular a data no seu programa e insira-o como string da consulta SQL.
Pelo menos para grandes tabelas (i.e.vários milhões de linhas, talvez combinado com associações) que vai dar a você uma considerável melhoria de velocidade, como o otimizador pode trabalhar com muito melhor.
argumento para a função DATEADD :
DATEADD (*datepart* , *number* , *date* )
datepart pode ser:aa, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
número é uma expressão que pode ser resolvido para um int que é adicionado à datepart da data
data é uma expressão que pode ser resolvido para um horário, data, smalldatetime, datetime, datetime2, ou datetimeoffset valor.
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 @D. E.Branco, veio aqui para semelhantes, mas diferentes razões que a pergunta original.A pergunta original pede para os últimos 365 dias.@samjudson respostas que fornece.@D. E.Branca de resposta retorna os resultados para o ano anterior.
Minha consulta é um pouco diferente, já que ele trabalha para o antes do ano até e incluindo a data atual:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Por exemplo, em Fev 17, 2017 esta consulta retorna resultados de 1/1/2016 para 2/17/2017
Eu tive um problema semelhante, mas que o programador anterior apenas desde a data em mm-aaaa.A minha solução é simples, mas poderia ser útil para alguns (eu também queria ter a certeza de início e término espaços foram eliminados):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())