SQL Server: obtenha dados apenas do ano anterior


98

Estou escrevendo uma consulta na qual preciso obter os dados apenas do ano passado. Qual é a melhor maneira de fazer isso?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

Respostas:


196

O seguinte adiciona -1 ano à data atual:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

1
O seu está mais limpo, mas aqui está o que eu tinha: ANO (GETDATE ()) - 1
— PCPGMR

2
Isso retorna um número, não uma data, você não poderia comparar isso com uma data, sem também calcular o ano dessa data. Isso retornaria resultados incorretos para 31 de dezembro de 2014 vs 1 de janeiro de 2015 - que estão em anos diferentes, mas não com um ano de diferença ...
— samjudson

corrigir. Eu precisava comparar os anos pelo número do ano, então de 2013 a 2014, por exemplo, já que os dados que chegam tinham apenas o ano. Não fui claro em meu comentário. Obrigado
— PCPGMR

Recebi uma mensagem de erro ao executar esta consulta ... "FUNCTION DatabaseName.DATEADD does not exist" Alguma sugestão?
— Marcello Perri de

10

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.


7

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'

Isso terá um desempenho muito ruim em tabelas grandes, sua consulta fará um loop em cada registro para avaliar o valor do ano da data, seria melhor usar um intervalo de datas
— Adriaan Davel


4

O mais legível, IMO:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

Qual:

  1. Obtém agora a data e hora GETDATE () = # 8/27/2008 10:23 am#
  2. Converte em uma string com formato 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. Converte para uma data e hora CONVERTER (data e hora, '27/08/2007') = # 27/08/2008 12:00 AM#
  4. Subtrai 1 ano DATAADD (aa, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

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).


2

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

0

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.


2
Seria melhor se você criar uma string parametrizada e evitar colocar o valor na própria string ...
— Adriaan Davel

0

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.


0
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

1
Isso não responde à questão.
— Nathan Skerl

Além disso, os loops while geralmente são ruins para SQL
— StingyJack

0

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


0

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())

0

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()

seria bom se você pudesse adicionar a versão do servidor MSSQL para o qual isso funciona.
— estava comigo em
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.