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'
Foi útil?

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:

  1. Fica agora é datetime GETDATE() = #8/27/2008 10:23am#
  2. Converte para uma string com o formato de 101 CONVERT(varchar, #8/27/2008 10:23am#, 101) = '8/27/2007'
  3. Converte uma data e hora CONVERTER(datetime, '8/27/2007') = #8/27/2008 12:00#
  4. 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())
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top