Erro ao emitir relatório diário

Boa noite a todos estou usando este código,
Ele pega a data inicial e a data final
porem a data inicial e a final é o mesmo dia

Pois estou querendo ver as vendas do mesmo dia.
acontece q eu tenho q aumentar um dia para ver as vendas do dia atual, como eu corrigiria isso???

private void relatorioDiario() {
    if (jtData_inicial.getText().equals(" / / ")) {
        JOptionPane.showMessageDialog(this, "Preencha o campo data inicial.");
        jtData_inicial.requestFocus();
    } else if (jtData_final.getText().equals(" / / ")) {
        JOptionPane.showMessageDialog(this, "Preencha o campo data final.");
        jtData_final.requestFocus();
    } else {
        Date datainicial = null;
        Date datafinal = null;
    	    
        try {
            datainicial = format.parse(jtData_inicial.getText());
            datafinal = format.parse(jtData_final.getText());
        } catch (ParseException ex) {
            Logger.getLogger(RelatorioFinanceiro.class.getName()).log(Level.SEVERE, null, ex);
        }
        if ((!jtData_inicial.getText().equals("")) && (!jtData_final.getText().equals(""))) {
            String sql = "SELECT venda.data_inc as Data, \n"
                    + " clientes.nome AS Nome,\n"
                    + " usuario.usuario AS Usuário,\n"
                    + " venda.total as Total\n"
                    + "FROM venda\n"
                    + " INNER JOIN clientes ON \n"
                    + "  venda.id_cliente = clientes.id \n"
                    + " INNER JOIN usuario ON \n"
                    + "  venda.id_usuario = usuario.id \n"
                    + "where venda.data_inc between ? and ?"; // perceba as interrogações representando os parametros

            try {		    
                pst = conexao.prepareStatement(sql);
                pst.setDate(1, new java.sql.Date(datainicial.getTime())); // 1 para a primeira interrogação 
                pst.setDate(2, new java.sql.Date(datafinal.getTime()));   // 2 para a segunda interrgação
                rs = pst.executeQuery();
                tblOs.setModel(DbUtils.resultSetToTableModel(rs));
            } catch (SQLException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {
                JOptionPane.showMessageDialog(null, " Relatorio não localizado nesta data!");
            }
        }
    }
}

A coluna data_inc é DATE ou TIMESTAMP?

timestamp por isso o problema

Então você precisa fazer o seguinte:
Defina a dataInicial como sendo o dia com hora 00:00:00 e a dataFinal como sendo o dia e hora como 23:59:59

public Date criaDataComHoraEspecifica(String data, String hora) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss);
    return sdf.parse(data + " " + hora);
}

E para chamar o método:

Date dataInicial = criaDataComHoraEspecifica(jtData_inicial.getText(), "00:00:00"); //Pode criar uma constante private static final String HORA_ZERO = "00:00:00";
Date dataFinal = criaDataComHoraEspecifica(jtData_final.getText(), "23:59:59"); //Pode criar uma constante private static final String HORA_ZERO = "23:59:59";

Aí passa esses caras como parâmetros pro método de consulta.

P.S: Evite misturar a consulta com elementos do front, no teu método você pega direto os JTextFields e mistura tudo, isso é errado e difícil de manter.
P.S.1: siga os padrões de nomes, o java só prevê uso de underline em nomes de constantes.

so nao entendi onde eu coloco

Date dataInicial = criaDataComHoraEspecifica(jtData_inicial.getText(), “00:00:00”); //Pode criar uma constante private static final String HORA_ZERO = “00:00:00”;
Date dataFinal = criaDataComHoraEspecifica(jtData_final.getText(), “23:59:59”); //Pode criar uma constante private static final String HORA_ZERO = “23:59:59”;

Veja, como o teu código está uma bagunça total, realmente fica difícil encontrar um local onde pode colocá-lo.
Entende, agora, a importância de um código organizado, separado em partes especializadas em fazer coisas específicas?
Até você corrigir tudo isso e criar um código decente, substitua estas linhas:

datainicial = format.parse(jtData_inicial.getText());
datafinal = format.parse(jtData_final.getText());

Use as mesmas variáveis, só troque pela chamada do método que sugeri.

o codigo foi @staroski q me arrumou achei top

ele é um ótimo programador, só o problema é q pra funcionar eu teria q aumentar 1 dia, esse era o erro

mas eu te agradeço pela ajuda top, vou tentar encaixar aqui era isso q eu estava procurando

vou tentar aqui se eu não consegui eu te chamo

Estranho o @staroski colocar uma query numa classe que parece frontend… Não me parece coisa dele.

Ele me ajudou,

empaquei nao do conta, tenho dificuldade com timestamp

Droga, já estão reconhecendo minha forma de agir! :joy:

Lembro de ter ajudado em um outro post onde essa query estava sendo montada com concatenação de String.
Mostrei como parametrizar os java.sql.Date no PreparedStatement.

Mas realmente, eu não faria essas queries no frontend. :sunglasses:

Qual a dificuldade exatamente?
Se não explicar, é difícil saber como ajudar.

aquele código funcionava , mas somente se eu adicionasse 1 dia a mais.
pois o campo data_inc é timestamp

Fera, existe uma grande diferença entre funcionar e estar bom.
Veja, teu notebook pode queimar a tela, vai funcionar, mas não estará bom, não é mesmo?

1 curtida

é por isso q estou pedindo ajuda se tivesse bom eu nem pedia fera

Cara, não entenda errado.
O que eu estou dizendo é que você precisa organizar as coisas.
Ninguém nasceu sabendo e todo mundo cometeu esses erros.
A questão é que eu espero que você não se contente com o "está funcionando’ e busque o “está ótimo”.

pois é, não estou me contentando rs
tem um mes q busco no google

eu prefiro sql, q posso manipular, mas se nao de certo tenho outro codigo q funciona perfeito, mas não é em SQL, assim eu ficaria limitado.

ou entao aumentar 1 dia no segundo campo, mas fica tosco

Ao invés de utilizar java.sql.Date, utilize java.sql.Timestamp.
Você pode utilizar um java.util.Calendar para ajustar entre 00:00h e 23:59h.

Método pra obter um Timestamp a partir de um Date já informando a hora e o minuto desejado:

private Timestamp getTimestamp(Date date, int hora, int minuto) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, hora);
    calendar.set(Calendar.MINUTE, minuto);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return new Timestamp(calendar.getTime().getTime());
}

Exemplo de uso:

private void relatorioDiario() {
    if (jtData_inicial.getText().equals(" / / ")) {
        JOptionPane.showMessageDialog(this, "Preencha o campo data inicial.");
        jtData_inicial.requestFocus();
    } else if (jtData_final.getText().equals(" / / ")) {
        JOptionPane.showMessageDialog(this, "Preencha o campo data final.");
        jtData_final.requestFocus();
    } else {
        Date datainicial = null;
        Date datafinal = null;

        try {
            datainicial = format.parse(jtData_inicial.getText());
            datafinal = format.parse(jtData_final.getText());
        } catch (ParseException ex) {
            Logger.getLogger(RelatorioFinanceiro.class.getName()).log(Level.SEVERE, null, ex);
        }
        if ((!jtData_inicial.getText().equals("")) && (!jtData_final.getText().equals(""))) {
            String sql = "SELECT venda.data_inc as Data, \n"
                    + " clientes.nome AS Nome,\n"
                    + " usuario.usuario AS Usuário,\n"
                    + " venda.total as Total\n"
                    + "FROM venda\n"
                    + " INNER JOIN clientes ON \n"
                    + "  venda.id_cliente = clientes.id \n"
                    + " INNER JOIN usuario ON \n"
                    + "  venda.id_usuario = usuario.id \n"
                    + "where venda.data_inc between ? and ?"; // perceba as interrogações representando os parametros

            try {
                pst = conexao.prepareStatement(sql);
                pst.setTimestamp(1, getTimestamp(datainicial, 0, 0)); // 1 para a primeira interrogação
                pst.setTimestamp(2, getTimestamp(datafinal, 23, 59)); // 2 para a segunda interrgação
                rs = pst.executeQuery();
                tblOs.setModel(DbUtils.resultSetToTableModel(rs));
            } catch (SQLException ex) {
                Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
            } catch (NullPointerException ex) {
                JOptionPane.showMessageDialog(null, " Relatorio não localizado nesta data!");
            }
        }
    }
}

Vc é o kra, perfeito

Que Deus te abençoe Ricardo Staroski grandemente pelo resto da sua vida e te dê a salvação eterna
só isso q eu tenho a oferecer
amém

Muito obrigado