Verificar Horário com o Banco de Dados

Pessoal Bom dia!

Ainda sou iniciante em java e estou tendo dificuldade para trabalhar com horas. Na minha classe dos get e set eu coloquei o tipo para pegar a hora como String e por esse motivo, no meu JFrame eu só consigo comparar com o banco horas iguais e não o período igual. Por exemplo se eu seleciono um período das 14:00 às 15:00 e esse período já estiver cadastrado no banco ele funciona, mas se eu colocar 14:01 às 15:00 ele passa. Não consigo fazer o teste de maior e menor com string! Alguma luz?

Minha classe com os Get e Set:

public class Destino {
    private int id;
    private String nome;
    private String hora;
    private String data;
    private String motivo;
    private String motorista;
    private String area;
    private String carro;
    private String placa;
    private String unidade;
    private String email;
    private String acomp;
    private String horaS;
    private String horaR;
    private String status;

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the hora
     */
    public String getHora() {
        return hora;
    }

    /**
     * @param hora the hora to set
     */
    public void setHora(String hora) {
        this.hora = hora;
    }

    /**
     * @return the data
     */
    public String getData() {
        return data;
    }

    /**
     * @param data the data to set
     */
    public void setData(String data) {
        this.data = data;
    }

    /**
     * @return the motivo
     */
    public String getMotivo() {
        return motivo;
    }

    /**
     * @param motivo the motivo to set
     */
    public void setMotivo(String motivo) {
        this.motivo = motivo;
    }

    /**
     * @return the motorista
     */
    public String getMotorista() {
        return motorista;
    }

    /**
     * @param motorista the motorista to set
     */
    public void setMotorista(String motorista) {
        this.motorista = motorista;
    }

    /**
     * @return the area
     */
    public String getArea() {
        return area;
    }

    /**
     * @param area the area to set
     */
    public void setArea(String area) {
        this.area = area;
    }

    /**
     * @return the carro
     */
    public String getCarro() {
        return carro;
    }

    /**
     * @param carro the carro to set
     */
    public void setCarro(String carro) {
        this.carro = carro;
    }

    /**
     * @return the placa
     */
    public String getPlaca() {
        return placa;
    }

    /**
     * @param placa the placa to set
     */
    public void setPlaca(String placa) {
        this.placa = placa;
    }

    /**
     * @return the unidade
     */
    public String getUnidade() {
        return unidade;
    }

    /**
     * @param unidade the unidade to set
     */
    public void setUnidade(String unidade) {
        this.unidade = unidade;
    }

    /**
     * @return the email
     */
    public String getEmail() {
        return email;
    }

    /**
     * @param email the email to set
     */
    public void setEmail(String email) {
        this.email = email;
    }

    /**
     * @return the acomp
     */
    public String getAcomp() {
        return acomp;
    }

    /**
     * @param acomp the acomp to set
     */
    public void setAcomp(String acomp) {
        this.acomp = acomp;
    }

    /**
     * @return the horaS
     */
    public String getHoraS() {
        return horaS;
    }

    /**
     * @param horaS the horaS to set
     */
    public void setHoraS(String horaS) {
        this.horaS = horaS;
    }

    /**
     * @return the horaR
     */
    public String getHoraR() {
        return horaR;
    }

    /**
     * @param horaR the horaR to set
     */
    public void setHoraR(String horaR) {
        this.horaR = horaR;
    }

    /**
     * @return the status
     */
    public String getStatus() {
        return status;
    }

    /**
     * @param status the status to set
     */
    public void setStatus(String status) {
        this.status = status;
    }
    
}

Minha Classe DAO (Apenas o Adicionar):

package br.com.dao;

import br.com.conexao.ConnectionFactory;
import br.com.destino.Destino;
import br.com.telas.TelaPrincipal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JOptionPane;

/**
 *
 * @author elivelton.s
 */
public class DestinoDao extends TelaPrincipal {
    Connection connection;
    
    public DestinoDao (){
        this.connection = new ConnectionFactory().getConnection();
    }
    
    public void Adicionar (Destino destino){
        String sql = "INSERT INTO destino (nome_dest, hora_dest, data_dest, motivo_dest, motorista_dest, area_dest, carro_dest, placa_dest, unidade_dest, acomp_dest, horaS_dest, horaR_dest, statu) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)";
        try {
            PreparedStatement pst = connection.prepareStatement(sql);
            pst.setString(1, destino.getNome());
            pst.setString(2, destino.getHora());
            pst.setString(3, destino.getData());
            pst.setString(4, destino.getMotivo());
            pst.setString(5, destino.getMotorista());
            pst.setString(6, destino.getArea());
            pst.setString(7, destino.getCarro());
            pst.setString(8, destino.getPlaca());
            pst.setString(9, destino.getUnidade());
            pst.setString(10, destino.getAcomp());
            pst.setString(11, destino.getHoraS());
            pst.setString(12, destino.getHoraR());
            pst.setString(13, destino.getStatus());
            
            pst.execute();
        } catch (Exception e) {
            System.out.println("Erro ao ISERIR "+e.getMessage());
        }
    }

Ação do Botão Reservar no Meu JFrama:

private void btnReservarActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // TODO add your handling code here:

        btnReservar.setEnabled(false);
        btnSair.setEnabled(false);

//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
//        String dataFormatada = simpleDateFormat.format(txtData1.getDate());
        Destino destino = new Destino();
        destino.setMotorista((String) ComoMoto.getSelectedItem());
        destino.setArea((String) ComboArea.getSelectedItem());
        destino.setData(((JTextField) txtData1.getDateEditor().getUiComponent()).getText());
        destino.setHora(txtHora.getText());
        destino.setNome(txtDestino.getText());
        destino.setCarro(txtVeiculo.getText());
        destino.setPlaca(txtPlaca.getText());
        destino.setUnidade(txtUnidade.getText());
        destino.setAcomp(txtAcom.getText());
        destino.setMotivo(txtMotivo.getText());
        destino.setHoraS(txtHoraChegada.getText());
        destino.setHoraR(txtHoraRe.getText());
        destino.setStatus("RESERVADO");

        String sql1 = "Select horaS_dest, horaR_dest, data_dest, carro_dest FROM destino WHERE horaS_dest='" + txtHoraChegada.getText() + "'"
                + " and horaR_dest='" + txtHoraRe.getText() + "' and data_dest='" + ((JTextField) txtData1.getDateEditor().getUiComponent()).getText() + "' and carro_dest='" + txtVeiculo.getText() + "'";

        try {
            PreparedStatement pst = connection.prepareCall(sql1);
            rs = pst.executeQuery();
            while (rs.next()) {
                hora1 = (rs.getString("horaR_dest"));
                hora2 = (rs.getString("horaS_dest"));
                data = (rs.getString("data_dest"));
                carro = (rs.getString("carro_dest"));
            }
        } catch (Exception e) {
            System.out.println("Erro ao Selecionar " + e.getMessage());
        }

        if (txtUnidade.getText().equals("") || (Validar_hora(txtHoraRe.getText()) == false) || (Validar_hora(txtHoraChegada.getText()) == false)
                || (ComboArea.getSelectedItem().equals("<<Selecione>>")) || (txtData1.getDate().equals(""))
                || (txtHoraRe.getText().equals(":")) || (txtHoraChegada.getText().equals(":")) || (txtMotivo.getText().equals("")) || (txtVeiculo.getText().equals(""))
                || (ComoMoto.getSelectedItem().equals("<<Selecione>>")) || (txtDestino.getText().equals("")) || (txtPlaca.getText().equals(""))
                || ComboEmailE.getSelectedItem().equals("<<Selecione>>") || txtAcom.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Campos com * Obrigatórios ou Hora Inválida");
        } else { //Tratamento se caso já existe uma reserva no banco de dados para a data escolhida ou com a data do dia
            if (txtHoraRe.getText().equals(hora1) && (txtHoraChegada.getText().equals(hora2))
            && (txtData.getText().equals(((JTextField) txtData1.getDateEditor().getUiComponent()).getText())) && (txtVeiculo.getText().equals(carro))) {
                
                JOptionPane.showMessageDialog(null, "Horário Reservado ou Período Reservado para esse Veículo!");
                
            } else if (((JTextField) txtData1.getDateEditor().getUiComponent()).getText().equals(data)) { //Tratamento em caso da data for igual a data que já estiver com reserva
                
                JOptionPane.showMessageDialog(null, "Horário Reservado!");
                dispose();
                TelaReservas tela = new TelaReservas(null, rootPaneCheckingEnabled);
                tela.setVisible(true);
                            
            } else {
                DestinoDao destinoDao = new DestinoDao();
                destinoDao.Adicionar(destino);
                JOptionPane.showMessageDialog(null, "Reserva Realizada com Sucesso!");
          }

Pesquise sobre BETWEEN:

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

Select Hora1, Hora2 From destino Where Hora1 and Hora2 BETWEEN 14:00 AND 15:00;

Isso funciona com campos do tipo String?

Sim: “The values can be numbers, text, or dates.”

Seguindo a maneira que voce está fazendo ficaria assim:

Select Hora1, Hora2 From destino Where Hora1 BETWEEN '14:00' AND '15:00';

Mas por motivos de segurança (sql injection), não concatene na query valores vindos do usuário! Use parametros, veja na documentação abaixo o uso de parametro com setString:

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Eu uso dois campos para registrar a hora inicial e a hora final. Tentei aqui e não consegui. :frowning:

Poste o SQL que voce tentou e a descricao pontual do requisito. Coloque tambem a descricao desses campos, os nomes estão bem ruins para entender o significado.

Sem saber direito qual requisito, segue um exemplo qualquer:

select * from teste where ('14:01' between hora1 and hora2) and ('15:00' between hora1 and hora2)

Essa é minha qurery para selecionar que eu usei conforme orientado.
String sql2 = “Select horaR_dest, horaS_dest From destino Where horaR_dest BETWEEN '”+txtHoraRe.getText()+"’ AND ‘"+txtHoraChegada.getText()+"’";

    try {
        PreparedStatement pst = connection.prepareCall(sql1);
        rs = pst.executeQuery();
        while (rs.next()) {
            hora1 = (rs.getString("horaR_dest")); //Referente a hora inicial
            hora2 = (rs.getString("horaS_dest")); //Referente ao final final
            
        }
    } catch (Exception e) {
        System.out.println("Erro ao Selecionar " + e.getMessage());
    }

Como já havia dito, eu ainda sou iniciante e não conseguir fazer passando por parâmetros.

Eu pensei em mudar toda a minha estrutura, desde os get e ser, classe dao até o momento da captura do dado pelo usuário. Colocar todos os dados do tipo Date, creio que assim eu consigo realizar a condição: se hora(digitada pelo usuário) >= hora2(hora que já existe no banco) and hora1 (digitada pelo usuário) <= hora3 (hora que já existe no banco).

O ideal é usar time ou datetime, que foi feito para isso, mas também funciona para texto, tanto between quanto os operadores >= e <=. Between só é uma forma mais legível de representar esse caso.

select * from teste where ('14:01' between hora1 and hora2) and ('15:00' between hora1 and hora2)

Se é iniciante, então tá mais que na hora de começar a aprender fazendo corretamente usando parâmetros, conforme exemplo da documentação que te passei ou infinitos exemplos que vai achar via google.

Você é um Gênio! Realmente funciona! Testei essa linha no meu banco e funcionou. Mas na aplicação, como que eu faço para apresentar uma mensagem de erro para o usuário usando o IF?

Isso seria um assunto pra outro tópico. O que posso te adiantar é pesquisar sobre custom constraint validator com java, exemplos:

https://docs.jboss.org/hibernate/validator/4.1/reference/en-US/html/validator-customconstraints.html#validator-customconstraints-validator

E o como apresentar a mensagem, vai depender do tipo de front-end. Se for web, segue exemplo: https://www.caelum.com.br/apostila-java-web/spring-mvc/#11-12-exercicios-validando-tarefas

Entendo!

É java para desktop!

Tenho dois campos um para digitar a hora inicial da reserva e outro para hora final.

Não trabalho com Java para desktop, mas informe qual das tecnologias desktop está usando para alguém poder te ajudar. Se é Swing, SWT ou JavaFx. O ideal seria criar um tópico específico para isso. Independente do front-end você vai poder usar as soluções acima no seu pacote de Negócio.

1 curtida

Estou usando o Java Swing!

javaflex

Juntamente com um amigo, conseguimos resolver esse problema…olha só o código:

String sql3 = “Select count(*) as existe from destino where ((cast(horaR_dest as time) <= cast(? as time) and cast(horaS_dest as time) >= cast(? as time)) or (cast(horaR_dest as time)<= cast(? as time) and (cast(horaS_dest as time) <= cast(? as time)))) and data_dest = ? and carro_dest=?;”;

    try {
        PreparedStatement pst = connection.prepareCall(sql3);
        pst.setString(1,txtHoraRe.getText());
        pst.setString(2, txtHoraRe.getText());
        pst.setString(3, txtHoraChegada.getText());
        pst.setString(4, txtHoraChegada.getText());
        pst.setString(5, ((JTextField) txtData1.getDateEditor().getUiComponent()).getText());
        pst.setString(6,txtVeiculo.getText() );
        rs = pst.executeQuery();
        while (rs.next()) {
            existe = (rs.getInt("existe"));
        }
    } catch (Exception e) {
        System.out.println("Erro ao Selecionar " + e.getMessage());
    }

funcionou certinho.