Usuário com melhor resposta
Consulta por Data Mês/ Ano

Pergunta
-
Olá Pessoal,
estou com uma consulta que necessita retornar dados do mês anterior à data informada, a consulta abaixo funciona bem para os meses corridos de um ano qualquer, mas quando chega de Dezembro para Janeiro de qualquer ano não funciona, por causa justamente da virada de ano, alguém tem alguma dica simples para resolver este caso?
ALTER procedure [dbo].[SelectCorrecaoDataMoedaUltimoValor_sp] ( @moedaId int, @indiceId int, @data date ) as begin select top(1) ValorIndiceAcumulado, IndiceRevista from tbM_CorrecaoDataMoeda where (MoedaId = @moedaId and IndiceInflacaoId=@indiceId and Month(Data) < MONTH(@data)) end
Respostas
-
Eduardo, Lucas Grato pela ajuda, depois da minha ultima resposta foi que a ficha caiu para mim, a coisa é bem mais simples, hoje definitivamente eu não estou com a cabeça muito boa... A solução é simplesmente esta aqui:
ALTER procedure [dbo].[SelectCorrecaoDataMoedaUltimoValor_sp] ( @moedaId int, @indiceId int, @data date ) as begin select top(1) ValorIndiceAcumulado, IndiceRevista from tbM_CorrecaoDataMoeda where (MoedaId = @moedaId and IndiceInflacaoId=@indiceId and Data < @data) Order By Data desc
Grato a todos!- Marcado como Resposta EdmilsonSilva quarta-feira, 25 de abril de 2012 15:08
Todas as Respostas
-
-
-
Edmilson, bom dia.
Segue o código:
select top(1) ValorIndiceAcumulado, IndiceRevista from tbM_CorrecaoDataMoeda where (MoedaId = @moedaId and IndiceInflacaoId=@indiceId and Data between DATEADD(month, -1, @data) and @data )
Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
Eduardo, Grato pela resposta, é quase isso, mas falta alguma coisa.
A consulta funcionou para a questão da virada do ano, porém a a informação que a consulta vai retornar pode não estar dentro dos 30 dias anteriores ao mes em questão pode passar um pouco ou até mais de 1 mês. Por isso o (Month(Data) < MONTH(@data) funcionava para os meses corridos (sem vidara de ano) pois ele iria trazer qualquer mês menor que o mês atual.
Grato
-
-
O resultado é do Mês anterior, contudo o Mês anterior não é necessáriamente os 30 dias anteriores entende? pode ser 45 dias, pode ser 60 dias (neste caso já nem seria exatamente o Mês anterior mas 2 meses antes).
A questão toda é a seguinte, tenho uma data (hoje) e tenho que olhar para traz no tempo e achar a data mais próxima de hoje geralmente ela estará no Mês anterior (já o indice que busco é mensal), porém a data pode não estar exatamente no range de 30 dias para traz entende?
Na cosulta que vc montou a diferença de data é de cerca de 30 dias o que gerará erros, já que ele olha para um Range de 30 dias até a data de hoje, tem que ser o inverso de hoje até a primeira data passada.
Grato pela ajuda
-
Entendi... então fica assim:
select top(1) ValorIndiceAcumulado, IndiceRevista from tbM_CorrecaoDataMoeda where (MoedaId = @moedaId and IndiceInflacaoId=@indiceId and month(Data) < month(DATEADD(month, -1, @data) and @data ) )
Teste aí... Abs.Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp
-
Ola Ednilson
veja se isso te ajuda
SELECT TOP(1) VALORINDICEACUMULADO, INDICEREVISTA FROM TBM_CORRECAODATAMOEDA WHERE (MOEDAID = @MOEDAID AND INDICEINFLACAOID=@INDICEID AND DATA < CAST(SUBSTRING(CAST(@DATA AS VARCHAR) ,1,8) + '01' AS DATE)
Att.
Lukas Baldan -
Eduardo, Lucas Grato pela ajuda, depois da minha ultima resposta foi que a ficha caiu para mim, a coisa é bem mais simples, hoje definitivamente eu não estou com a cabeça muito boa... A solução é simplesmente esta aqui:
ALTER procedure [dbo].[SelectCorrecaoDataMoedaUltimoValor_sp] ( @moedaId int, @indiceId int, @data date ) as begin select top(1) ValorIndiceAcumulado, IndiceRevista from tbM_CorrecaoDataMoeda where (MoedaId = @moedaId and IndiceInflacaoId=@indiceId and Data < @data) Order By Data desc
Grato a todos!- Marcado como Resposta EdmilsonSilva quarta-feira, 25 de abril de 2012 15:08