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.