none
Mes anterior RRS feed

  • Pergunta

  •  

    Ola galera

     

    Preciso pegar em um select o mes anterior em uma tabela

    exemplo tenho uma tabela Teste com os campos

     

    conta

    data

    valor

     

    estou usando para pegar o mes anterior este comando DATEADD(M,-1,'2008-01-01') com este comando eu pego os dados do mes passado mas somente do dia tambem , mas preciso pegar de todo o mes anterior independete do dia informado do mes , teria outro comando onde eu pegaria apenas o mês ?

     

    Att,

     

     

    sexta-feira, 1 de fevereiro de 2008 12:11

Respostas

  • Boa Noite,

    Não recomendo construções como MONTH(Data), pois, ao aplicar funções sobre colunas você tem grandes chances de denegrir o desempenho de suas consultas:

    DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs
    http://gustavomaiaaguiar.wordpress.com/2011/07/03/datediff-convert-substring-e-funes-sobre-colunas-na-clusula-where-e-joins/

    Tente o seguinte:

    WHERE Data >= DATEADD(D,1-DAY(DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))),DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))) AND Data <
     DATEADD(M,1,DATEADD(D,1-DAY(DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))),DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))))

    Embora haja tantos DATEADDs, é mais calcular o valor uma única vez (ainda que complexo), do que aplicar uma função MONTH sobre cada registro da sua tabela. Se você estiver usando o 2012, tudo é mais simples:

    WHERE Data >= DATEADD(D,1,DATEADD(M,-2,EOMONTH(GETDATE()))) And Data < DATEADD(D,1,DATEADD(M,-1,EOMONTH(GETDATE())))

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Heloisa Pires terça-feira, 10 de julho de 2012 17:01
    quinta-feira, 5 de julho de 2012 02:13

Todas as Respostas

  • Bom dia

     

     

    Você pode fazer isso de diversar formas , a mais simples é esta

     

    SELECT DATEPART(mm,Getdate()) - 1

     

    Espero ter ajudado

     

    sexta-feira, 1 de fevereiro de 2008 12:13
  • Ola anderson

     

    O meu select é deta forma

    select * from DBO.F_DWBALANCOCONTABIL

    where data = DATEADD(M,-1,'2008-01-01')

     

     

    usei a instrução que vc me passou mas não retornou nenhuma linha , no caso acima ele tambem pega o ano anterior pois é 2007 , mes 12

     

    select * from DBO.F_DWBALANCOCONTABIL

    where data = DATEPART(mm,Getdate()) - 1

     

    teria outro comando que poderia usar , ou posso estar colocando errado

     

    Um abraço

     

     

     

    sexta-feira, 1 de fevereiro de 2008 12:27
  • Testa assim

     

     

    select * from DBO.F_DWBALANCOCONTABIL

    where Month(data) = DATEPART(mm,Getdate()) - 1

     

     

     

    Espero ter ajudado

    sexta-feira, 1 de fevereiro de 2008 12:43
  • Zipdrv

     

    Tente usar a consulta a seguir para ver se vai resolver seu problema.

     

    select * from sua_tabela

    where datepart (M, seu_campo_data) = case

    when DATEPART(mm,Getdate()) = 1 then 12

    else DATEPART(mm,Getdate()) - 1

    end

     

    Neste caso vc deve pegar apenas o mês do seu campo data. E quando o mês for 1 - janeiro deve ser usado um case, pois quando é mês 1 o sql subtrai 1 no valor do mês e assim seria 0.

     

    []s

     

    sexta-feira, 1 de fevereiro de 2008 12:46
  • meu amigo vc precisa pegar o primeiro dia do mes atual.

    então faz tudo que é menor a ele e maior ou iguar ao primeiro dia do mes anterior.


    Midana Fernandes Sana Fortaleza - CE Brasil

    quarta-feira, 4 de julho de 2012 12:20
  • Boa Noite,

    Não recomendo construções como MONTH(Data), pois, ao aplicar funções sobre colunas você tem grandes chances de denegrir o desempenho de suas consultas:

    DATEDIFF, CONVERT, SUBSTRING e funções sobre colunas na cláusula WHERE e JOINs
    http://gustavomaiaaguiar.wordpress.com/2011/07/03/datediff-convert-substring-e-funes-sobre-colunas-na-clusula-where-e-joins/

    Tente o seguinte:

    WHERE Data >= DATEADD(D,1-DAY(DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))),DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))) AND Data <
     DATEADD(M,1,DATEADD(D,1-DAY(DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))),DATEADD(M,-1,CAST(CONVERT(CHAR(8),GETDATE(),112) AS DATETIME))))

    Embora haja tantos DATEADDs, é mais calcular o valor uma única vez (ainda que complexo), do que aplicar uma função MONTH sobre cada registro da sua tabela. Se você estiver usando o 2012, tudo é mais simples:

    WHERE Data >= DATEADD(D,1,DATEADD(M,-2,EOMONTH(GETDATE()))) And Data < DATEADD(D,1,DATEADD(M,-1,EOMONTH(GETDATE())))

    [ ]s,

    Gustavo Maia Aguiar
    Blog: http://gustavomaiaaguiar.wordpress.com
    Vídeos:http://www.youtube.com/user/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    • Marcado como Resposta Heloisa Pires terça-feira, 10 de julho de 2012 17:01
    quinta-feira, 5 de julho de 2012 02:13
  • Bom dia Gustavo,

    Eu criei alguns gráficos utilizando esse comando, mas depois que virou de 2014 para 2015 os gráficos apresentaram problema.

    Será que é necessário incluir algo para o ano?

    Att,

    Taiane Dias

    sexta-feira, 9 de janeiro de 2015 12:27
  • Taianedf,

    Provavelmente você vai ter que seguir a mesma lógica que o Gustavo esta adotando para o mês.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 9 de janeiro de 2015 12:38
  • Olá,

        De acordo com as boas práticas para performance das suas queries você deve evitar utilizar funções na cláusula WHERE. Desta forma, evite o uso de Month(), DATEPART() no seu campo de filtro (CAmpo Data). Se você estiver utilizando o SQL Server 2012 ou superior, utilize a nova função EOMONTH para encontrar o primeiro e último dia do mês desejado. Segue um exemplo:

    -- Sua Query
    select * from DBO.F_DWBALANCOCONTABIL
    Where Data between dateadd(D, 1, EOMONTH(GETDATE(), -2)) and EOMONTH(GETDATE(), -1)
    
    -- Exemplo do EOMONTH
    SELECT dateadd(D, 1, EOMONTH(GETDATE(), -2)) DataInicial, EOMONTH(GETDATE(), -1) DataFinal
    
    /*
    Resultado para a data de 09/01/2015
    DataInicial DataFinal
    ----------- ----------
    2014-12-01  2014-12-31
    */
    


    Roberto Fonseca MCT / MCITP - Database Administrator 2008 MCITP - Database Developer 2008 MCITP - Business Intelligence 2008

    sexta-feira, 9 de janeiro de 2015 14:41
    Moderador