none
Consulta por Data Mês/ Ano RRS feed

  • 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

    quarta-feira, 25 de abril de 2012 12:08

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
    quarta-feira, 25 de abril de 2012 15:07

Todas as Respostas

  • Ja tentou usar a condição YEAR() ?

    Ficaria algo assim :

    where (MoedaId = @moedaId and
           IndiceInflacaoId=@indiceId and
           (Month(Data) < MONTH(@data)
    and YEAR(DATA) < YEAR(@DATA)
    )

    http://www.diaadiasql.com.br

    quarta-feira, 25 de abril de 2012 12:28
  • Renato,  neste caso  ele  iria sempre pegar o mês e o ano anteriores  ou seja,  de um ano  atrás  o que eu quero é  apenas do mês anterior.  esta solução não resolve.

    Grato,

    quarta-feira, 25 de abril de 2012 12:35
  • 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

    quarta-feira, 25 de abril de 2012 12:55
  • 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

    quarta-feira, 25 de abril de 2012 14:02
  • Edmilson, vc quer trazer os resultados somente do mês anterior ou todos os meses anteriores ?

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp

    quarta-feira, 25 de abril de 2012 14:10
  • 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

    quarta-feira, 25 de abril de 2012 14:50
  • 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

    quarta-feira, 25 de abril de 2012 15:02
  • 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

    quarta-feira, 25 de abril de 2012 15:04
  • 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
    quarta-feira, 25 de abril de 2012 15:07