Imagino que vossa comparação afeta meses de anos diferentes, o que faz seu comando não funcionar.
Utilizando a junção do mês e ano desejado (no caso ano e mês), você irá conseguir obter o resultado desejado, veja:
SELECT *
FROM paposql.pagamento
WHERE concat(ano_competencia,mes_competencia) >= '201211'
AND concat(ano_competencia,mes_competencia) <= '201304'
Espero ter lhe sido útil, abraços.
[size=9]Os testes foram efetuados em uma base de dados MySQL utilizando a ferramenta MySQL Workbench.[/size]
_ _
Fabiano Abreu Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL
Ops, testei aqui e o comando dará o mesmo problema. Acho que a solução é comprar antes as datas e ver qual é a inicial e qual é a final.[/quote]
Obrigada Erick pela sugestão.
Já havia utilizado BETWEEN algumas vezes, mas não obtive sucesso dessa vez pois não estou trabalhando com datas, somente com mês e ano.
Por exemplo, digamos que você queira saber tudo que vai de novembro (11) a abril (04).
Você tem de dividir em duas condições, as coisas que vão de novembro a dezembro (11 a 12) e as coisas que vão de janeiro a abril (01 a 04).
BETWEEN não faz milagres, mas pensar um pouquinho faz. [/quote]
Obrigada pela ajuda, já utilizei BETWEEN algumas vezes e já havia pensado nessa possibilidade, mas ainda estou confusa quanto a considerar também os casos em que irei precisar utilizar meses de um mesmo ano.
Por exemplo:
Mes1 - Janeiro(01)
Mes2 - Julho(07)
Nem sempre irei utilizar meses de anos diferentes, alguma outra sugestão?
Creio que o problema não seja nem a forma que a consulta é criada, mas a tabela possuir colunas mês e ano separadas.
Se fossem datas, você não teria este problema.
Ex.:
Logo, o select poderia ser:
SELECT col1, col2, col3 FROM tabela WHERE data between(dtIni, dtFim);
Onde dtIni seja anterior a 01/01/2010 e dtFim seja posterior a 01/11/2011.
Imagino que vossa comparação afeta meses de anos diferentes, o que faz seu comando não funcionar.
Utilizando a junção do mês e ano desejado (no caso ano e mês), você irá conseguir obter o resultado desejado, veja:
SELECT *
FROM paposql.pagamento
WHERE concat(ano_competencia,mes_competencia) >= '201211'
AND concat(ano_competencia,mes_competencia) <= '201304'
Espero ter lhe sido útil, abraços.
[size=9]Os testes foram efetuados em uma base de dados MySQL utilizando a ferramenta MySQL Workbench.[/size]
_ _
Fabiano Abreu Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL[/quote]
Fabiano!
Obrigada pela ajuda…
Você soube dizer exatamente o que esta acontecendo, além dos meses eu também tenho os anos que posso utilizar.
Fiz alguns teste utilizando concat, mas ainda não deu muito certo. A última das tentativas foi essa:
WHERE concat(ano1, '-', mes1) >= concat(ano_competencia, '-', mes_competencia)
AND concat(ano2, '-', mes2) <= concat(ano_competencia, '-', mes_competencia)
[quote=drsmachado]Creio que o problema não seja nem a forma que a consulta é criada, mas a tabela possuir colunas mês e ano separadas.
Se fossem datas, você não teria este problema.
Ex.:
Logo, o select poderia ser:
SELECT col1, col2, col3 FROM tabela WHERE data between(dtIni, dtFim);
Onde dtIni seja anterior a 01/01/2010 e dtFim seja posterior a 01/11/2011.
Se é que seu banco está assim…[/quote]
Então, no banco estão colunas separadas para mês e para ano e já temos muitos e muitos dados armazenados.
Será que concatenando eu não consigo obter resultado utilizando BETWEEN?
Era o que eu estava pensando. Porém, além de concatenar, seria preciso transformar o valor em Date, para que seja possível verificar se o valor concatenado está no intervalo desejado.
Nossa…
Então, essa SQL será a Query do meu relatório do iReports.
Complicado transformar pra Date né?
Teria que concatenar, e jogar em uma variável e depois devolver ela pra dentro da Query, pra depois calcular…
Acho que além de ser complicado, pode deixar o relatório bem lento.
Dentro do oracle, é possível chamar a função to_date(variavel, formato) e definir qual o formato de data eu quero para a variável que eu passo.
No caso, a variável, seria a concatenação dos campos.
Como não sei qual o banco que você está usando, teria que ver se ele possui algo assim e de que forma ele se adapta à uma concatenação de colunas como argumento para ser convertido em data.
O Banco de Dados é MySQL, encontrei algumas funções como CONCAT já utilizada anteriormente e função FORMAT, que seria pegar o valor concatenado e depois formatalo dentro da FORMAT, esse tratamente teria que ser feito com o auxilio de Java também né?
Queria fazer isso tudo dentro da própria SQL, conheço pouco de SQL, por isso essas milhares de dúvidas.
Desculpa se estou sendo chata…
Você pode concatenar os dados e formata-los através de SQL sim.
No script que lhe passei a rotina iria funcionar conforme especificou, seria interessante você detalhar o que realmente deseja, assim fica mais fácil lhe ajudar.
_ _
Fabiano Abreu Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL
Você pode concatenar os dados e formata-los através de SQL sim.
No script que lhe passei a rotina iria funcionar conforme especificou, seria interessante você detalhar o que realmente deseja, assim fica mais fácil lhe ajudar.
_ _
Fabiano Abreu Papo Sql - Um blog com tutoriais, dicas e truques sobre SQL[/quote]
Bom dia Fabiano,
Bom eu preciso do Resultado de todos os Pagamentos, dentro de um intervalo de competência(mês/ano).
Esse intervalo pode ser de anos diferentes ou iguais.
Eu tenho que concatenar e comparar né, mas já tentei de várias formas e não deu certo.
Usando para testar os seguintes valores:
Mes1 = 11
Mes2 = 04
Ano1 = 2011
Ano2 = 2012
O que acontece de errado é que meses como o mes 5 de 2012 está exibindo também seus resultados.
Pessoal, acho que consegui! Essa foi minha resolução…
Pode ser que existam jeitos mais rápidos e práticos pra resolver, mas já deu pra atender minhas necessidades!
WHERE
AND "+ano1+" = ano_competencia
AND "+mes1+" <= mes_competencia
OR
AND "+ano2+" = ano_competencia
AND "+mes2+" >= mes_competencia