none
BETWEEN mesI/anoI AND mesF/anoF RRS feed

  • Pergunta

  • Como fazer um BETWEEN em uma data usando apenas o mês e o ano?

    Exemplo: Entre 10/2011 e 09/2012

    Tentei fazer o BETWEEN separadamente para o mês e o ano, porém, como no caso acima, o mês inicial é maior que o mês final, ou seja não retorna valores.


    [b]Sergio Ivanenko[/b]


    • Editado Ivanenko quarta-feira, 10 de outubro de 2012 03:53
    quarta-feira, 10 de outubro de 2012 03:52

Respostas

  • Ivanenko, isto depende de qual o tipo de dados voce esta usando na coluna da sua data, se for um tipo char, varchar ou inteiro no formato AAAAMMDD voce pode usar um left de 6, se for tipo date ou datetime voce tem que fazer uma conversão para conveguir, no exemplo abaixo teria uma coluna do tipo smalldatetime, onde converto para o formato aaaammdd e pegou o left 6 que seria o ano e mes, tente desta forma.

     

    select *  from tabela
    where left(convert(char(8), data,112),6) between '201110' and '201209'


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quarta-feira, 10 de outubro de 2012 09:59
    • Marcado como Resposta Ivanenko quarta-feira, 10 de outubro de 2012 12:02
    quarta-feira, 10 de outubro de 2012 09:59

Todas as Respostas

  • Ivanenko, isto depende de qual o tipo de dados voce esta usando na coluna da sua data, se for um tipo char, varchar ou inteiro no formato AAAAMMDD voce pode usar um left de 6, se for tipo date ou datetime voce tem que fazer uma conversão para conveguir, no exemplo abaixo teria uma coluna do tipo smalldatetime, onde converto para o formato aaaammdd e pegou o left 6 que seria o ano e mes, tente desta forma.

     

    select *  from tabela
    where left(convert(char(8), data,112),6) between '201110' and '201209'


    Alexandre Matayosi Conde Mauricio. Se esta sugestão for útil, por favor, classifique-a como útil. Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Sugerido como Resposta Alexandre Matayosi quarta-feira, 10 de outubro de 2012 09:59
    • Marcado como Resposta Ivanenko quarta-feira, 10 de outubro de 2012 12:02
    quarta-feira, 10 de outubro de 2012 09:59
  • Alexandre

    Obrigado


    [b]Sergio Ivanenko[/b]

    quarta-feira, 10 de outubro de 2012 12:02
  • Neste caso, aconselharia a ter colunas separadas para mês e ano. Isso permitiria aplicar o between sem ter que utilizar funções no Where. Usando funções você corre o risco de "bloquear" a utilização de índices por parte do SQL.

    Cuidado com a utilização de funções em consultas.


    Roberson Ferreira - Database Developer
    Acesse: www.robersonferreira.com.br
    Email: contato@robersonferreira.com.br

    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 10 de outubro de 2012 17:11
    Moderador
  • Robertson.

    Analisei a sua sugestão, e mudei o código. O usuário ao acionar a consulta irá informar o período em mês/ano, porém a mesma será executada no formato date, ou seja:

    mesAnoInicial: 1 & "/" &  mesInformado & "/" & anoInformado

    Para o período final, criei uma função que retorna o último dia do mês informado. No caso de fevereiro, verifica se o ano informado é bisexto, se sim retorna 29, se não 28.

    mesAnoFinal: rotinaUltimoDia(mesInformado) & "/" &  mesInformado & "/" & anoInformado

    Converto para date e executo a consulta.

    Na prática foi preciso criar duas variaveis no aplicativo e mais a função, mas tenho a segurança que terei o retorno correto da consulta.

    Obrigado.


    [b]Sergio Ivanenko[/b]

    sexta-feira, 12 de outubro de 2012 03:54