[Resolvido] Ajuda com SQL que seleciona intervalo de valores

Bom dia,

Queria saber qual uma boa maneira de selecionar um intervalo de valores.

Tenho uma tabela no BD assim:

[b]Tabela: pagamento

Colunas:

id_pagamento

mes_competencia
ano_competencia
[/b]

Quero recuperar os pagamentos que devem ser feitos em um intervalo de competencia.

Por exemplo:

Mas logo de início já tive problema com a lógica.

Se mes1 = 11 e mes2 = 04 não obtenho meu resultado.
Se mes1 = 04 e mes2 = 07 resultado obtido com sucesso.

Obrigada galera!

Use o BETWEEN:

http://www.w3schools.com/sql/sql_between.asp

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.

Ora pois pois.

Seu problema deve ser resolvido com 2 betweens.

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.

Olá franzzita,

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

1 curtida

Pessoal!

Obrigada pela ajuda, vou efetuar todos os testes aqui…

Logo posto o resultado.

Obrigada mesmooooo!

[quote=ErickRAR]Use o BETWEEN:

http://www.w3schools.com/sql/sql_between.asp

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.

[quote=entanglement]Ora pois pois.

Seu problema deve ser resolvido com 2 betweens.

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.

Se é que seu banco está assim…

[quote=Fabiano Abreu]Olá franzzita,

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)

Se tiver mais alguma sugestão…

[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?

Obrigada mesmo…

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.

Não teria uma forma mais simples?

Obrigada drsmachado!

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…

Obrigada mesmo pela ajuda!

franzzita,

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=Fabiano Abreu]franzzita,

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.

Obrigada pela atenção!

Fabiano, achei o problema na comparação dos valores concatenados.

Ex1:
Mes1 = 11
Ano1 = 2011
Resultado = ‘201111’

Quando essas informações cruzam com as do banco, por exemplo:

Ex2:
mes_competencia = 07
ano_competencia = 2011
Resultado: ‘20117’

Ou seja,

Resultado Ex2 > Resultado Ex1

Ele exibe valores de meses como 7, 8, 9.

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

Obrigada a todos que colaboraram!

Abraços.

Regards;