[RESOLVIDO] Datas sql

12 respostas
AndreMendes

Em um sistema, preciso buscar os aniversariantes da semana no banco.
Estou fazendo assim:

public List<Cliente> buscarAniversariantes(Date dataInicial, Date dataFinal) throws SQLException, ClassNotFoundException {
        
        connection = conectar();
        String sql = "SELECT * FROM pizzaexpress.clientes WHERE aniversario BETWEEN ? AND ? ORDER BY DATE(aniversario) DESC";
        List<Cliente> l = new ArrayList<Cliente>();
        stm = connection.prepareCall(sql);
        stm.setDate(1,dataInicial );
        stm.setDate(2,dataFinal );
        rs = stm.executeQuery();
        while(rs.next()){

            Cliente cliente = new Cliente(  rs.getString("nome"),
                                            rs.getString("telefone"),
                                            rs.getString("endereco"),
                                            rs.getString("bairro"),
                                            rs.getString("complemento"),
                                            rs.getString("email"),
                                            rs.getDate("aniversario"),
                                            rs.getString("observacao"));
            l.add(cliente);
        }
        desconectar();
        return l;

    }

O problema é que dessa forma, ele só me retorna os cliente com nascimento no mesmo ano. Eu queria que ele buscasse, independente do ano, só pelo mês. Mas como eu vou fazer isso ?
Pensei em uma POG, na hora de inserir, inserir sempre com o mesmo ano, mas não achei legal.

12 Respostas

dxos

utiliza MOUNTH no seu between.

ricardo.ludwig

No Oracle você pode mudar sua query assim:

SELECT id, nome, endereco, to_char(datanascimento,‘dd/mm/yyyy’) FROM contatos
WHERE to_char(datanascimento,‘mm’) BETWEEN ‘01’ AND ‘12’
ORDER BY datanascimento DESC;

Sendo que respectivamente 01 = Janeiro e 12 = Dezembro, ou seja você irá filtrar somente pelo os meses.

Abcs.

AndreMendes

Estou usando mysql.
Dei uma olhada, e tentei fazer dessa forma com o month

String sql = "SELECT * FROM pizzaexpress.clientes WHERE aniversario BETWEEN ? AND DATEPART ? ORDER BY DATE(aniversario) DESC";

Ele roda, mas nao funciona.

AndreMendes

Alguem ?

dxos

vc tentou usar o MONTH ?

String sql = "SELECT * FROM pizzaexpress.clientes WHERE MONTH(aniversario) between ? and ? ORDER BY dataNascimento DESC";
AndreMendes

[quote=dxos]vc tentou usar o MONTH ?

String sql = "SELECT * FROM pizzaexpress.clientes WHERE MONTH(aniversario) between ? and ? ORDER BY dataNascimento DESC";

Eu tentei dessa forma:

String sql = "SELECT * FROM pizzaexpress.clientes WHERE aniversario between MONTH(?) and MONTH(?) ORDER BY dataNascimento DESC";

Vou tentar da forma que voce me passou. Obrigado

pmlm

Se quiseres simplesmente para um mês, basta:

String sql = "SELECT * FROM pizzaexpress.clientes WHERE MONTH(aniversario) = MONTH(?) ORDER BY dataNascimento DESC";

Nota que este “order by” trás por ano, mês e dia, e não apenas por dia no mês

AndreMendes

Funcionou. Aqui vai a solução:

String sql = "SELECT * FROM pizzaexpress.clientes WHERE MONTH(aniversario) BETWEEN MONTH(?) AND MONTH(?) ORDER BY DATE(aniversario) DESC";

O problema é que eu preciso o intervalo entre duas datas no mesmo mes:

BETWEEN MONTH(?) AND MONTH(?)

Como fazer para que minha busca também leve os dias em consideração ?

pmlm

Atenção que, conforme tens, se puseres o intervalo entre 05SET e 12SET, por exemplo vai apanhar todos os registos de Setembro e não apenas os de 5 a 12.
Para isso precisas de comparar dia e mês.

AndreMendes

Como posso fazer isso?
Não tenhoa menor ideia:/

pmlm
String sql = "SELECT * FROM pizzaexpress.clientes WHERE DATE_FORMAT(aniversario, '%m%d') BETWEEN DATE_FORMAT(?, '%m%d') AND DATE_FORMAT(?, '%m%d') ORDER BY DATE(aniversario) DESC";
AndreMendes

Perfeito, funcionou e aprendi o DATE_FORMAT. Abraços

Criado 11 de setembro de 2010
Ultima resposta 14 de set. de 2010
Respostas 12
Participantes 4