entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

comparar las horas en java obtenidas desde la base de datos de mysql

Hola necesito que alguien me oriente, ¿Como puedo comparar desde Java, el registro de entrada con el registro del horario de entrada asi como el registro y horario de comienzo de comida obtenidas desde base de datos en mysql , O tendria que comparar el registro de entrada con la hora actual utilizando NOW(), en mysql ?????
;puesto que el empleado registra su entrada y registra su salida 4 veces al dia seria un total de 8 entradas y salidas.

tengo estas 2 tablas:

DROP TABLE IF EXIST HORARIOS;
CREATE TABLE HORARIOS(
ID_HORARIO INT(11) AUTO_INCREMENT NOT NULL,
NOMBRE_HORARIO VARCHAR(45),
HORARIO_ENTRADA TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
HORARIO_COMIENZO_COMIDA TIMESTAMP DEFAULT NOW(),
HORARIO_TERMINO_COMIDA TIMESTAMP DEFAULT LOCALTIME(),
HORARIO_SALIDA TIMESTAMP DEFAULT LOCALTIMESTAMP(),
PRIMARY KEY(ID_HORARIO)
);

DROP TABLE IF EXIST ASISTENCIA;
CREATE TABLE ASISTENCIA(
ID_ASISTENCIA INT(11) AUTO_INCREMENT NOT NULL,
ID_EMPLEADO INT(11) NOT NULL,
HORA_ENTRADA DEFAULT CURRENT_TIMESTAMP,
HORA_COMIENZO_COMIDA TIMESTAMP DEFAULT NOW(),
HORA_TERMINO_COMIDA TIMESTAMP DEFAULT LOCALTIME(),
HORA_SALIDA DEFAULT LOCALTIMESTAMP(),
PRIMARY KEY(ID_ASISTENCIA)
);

en la clase que tengo es lo siguiente

public List<modeloAsistencia>consultarxdiferenciaminutos(int id_empleado_aux ) throws ParseException {
         //Creo un objeto SimpleDateFormat
         SimpleDateFormat fecha_formato = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");

        PreparedStatement psmt = null;
        ResultSet tabla = null;
        List<modeloAsistencia> list = new ArrayList<modeloAsistencia>();
         String consultar = "SELECT A.ID_ASISTENCIA,E.APELLIDO_PATERNO,E.APELLIDO_MATERNO,E.NOMBRE,TIME_FORMAT(A.HORA_ENTRADA,'%H:%i %s'),TIME_FORMAT(A.HORA_SALIDA,'%H:%i:%s'),   ";

     try {
//creo los  objetos de tipo date
      Date fecha_hora_entrada_aux =" ";
          Date fecha_horario_entrada_aux = " ";
         // duda de como obtengo los valores desde la base de datos creo que no esta tomando ningun valor
          fecha_horario_entrada_aux = fecha_formato.parse(horario_entrada);
          fecha_hora_entrada_aux = fecha_formato.parse(hora_entrada);
          fecha_horario_comienzo_comida_aux = fecha_formato.parse(horario_comienzo_comida);
          fecha_hora_comienzo_comida_aux = fecha_formato.parse(hora_comienzo_comida);

//para hacer la comparacion de la hora de  registro de entrada 08:10:00 con el horario de entrada de 08:00:00 y  registro de comienzo de comida 14:10:00  compararlo con horario de comienzo de la comida 14:00:00 compararlo  con  en java o tendria que hacerlo en mysql que es mas factible ????
if( fecha_hora_entrada_aux.after(fecha_horario_entrada_aux) && fecha_hora_comienzo_comida_aux .after(fecha_horario_comienzo_comida_aux ) ){
 consultar +=" SEC_TO_TIME((TIME_TO_SEC(TIMEDIFF(HORA_ENTRADA,******************)))) DIFERENCIA_MINUTOS   ";

Tengo la consulta que me hace la diferencia de minutos entre del registro de entrada

  SELECT ID_EMPLEADO,
 SEC_TO_TIME((TIME_TO_SEC(TIMEDIFF(HORA_ENTRADA,******************)))) DIFERENCIA_MINUTOS
  FROM ASISTENCIA;
 En la consulta que deje ***********, tendira que colocar el horario de entrada, o la hora actual colocando NOW() ???? 
}
catch(Exception e){
 System.out.println( e);
}
 if (id_empleado_aux != 0 ){
            consultar +="FROM ASISTENCIA A,EMPLEADO E  WHERE AND E.ID_EMPLEADO= ?; ";
        }
try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/empleados_asistencias");
            Connection con = ds.getConnection();
            psmt = con.prepareStatement(consultar);
            if (id_empleado_aux != 0 ){
             psmt.setInt(1, id_empleado_aux);
            }
            tabla = psmt.executeQuery();
            while (tabla.next()) {
                modeloAsistencia modeloAsistencia = new modeloAsistencia();
                modeloAsistencia.setId_asistencia(tabla.getInt(1));
                //
                list.add(modeloAsistencia);
            }
            psmt.close();;
            tabla.close();
            con.close();
        } catch (Exception e) {
            System.out.println( e);
        }
        return list;
    }

}

0voto

white comentado

Por que no obtienes todas las horas de las 2 tablas en una consulta. yo lo veo mas eficiente compararlo en java, como haces la consulta de la tabla HORARIOS? y como la relacionas con la tabla ASISTENCIA.? que contiene la variable horario_entrada?

0voto

Maria Cor comentado

Me falto nombrar la tabla empleados tiene la llave foranea que es id_horario, y en la tabla asistencia tiene como llave foranea el id_empleado, en si la tabla horarios y turnos no las tengo relacionadas, quedaria de la siguiente manera tabla horarios,
agregaria la llave foranea id_asistencia.
y en la consulta perdón no lo puse de manera correcta ,quedaria asi:

String consultar = "SELECT A.ID_ASISTENCIA,E.APELLIDO_PATERNO,E.APELLIDO_MATERNO,E.NOMBRE,TIME_FORMAT(H.HORARIO_ENTRADA,'%H:%i %s'),
TIME_FORMAT(H.HORARIO_SALIDA,'%H:%i %s'),TIME_FORMAT(A.HORA_ENTRADA,'%H:%i %s'),TIME_FORMAT(A.HORA_SALIDA,'%H:%i:%s')
 FROM EMPLEADO E,HORARIOS H,ASISTENCIA A WHERE E.ID_HORARIO=H.ID_HORARIO AND E.ID_EMPLEADO= ?;";

con respecto a la variable horario_entrada
es en la parte

 fecha_horario_entrada_aux = fecha_formato.parse(horario_entrada);

creo que no esta recibiendo ningun valor,
solo lo inicialice ahi es en donde me surgio la incertidumbre ,
el metodo que estoy utilizando .getString() ó getDate() esto va a delvover el valor del campo del registo de la tabla lo que no se es como estructurarlo para hacer la condicional

 modeloAsistencia.setHorario_entrada(tabla.getString(5));
 modeloAsistencia.setHorario_salida(tabla.getString(6);
 modeloAsistencia.setHora_entrada(tabla.getString(7));
 modeloAsistencia.setHora_salida(tabla.getString(8);

1 Respuesta

2votos

white Puntos75880

No creo sea necesario sacar la diferencia en minutos con una consulta en mysql, puedes hacerlo en java.

por favor reviza esta pregunta similar:

http://entredesarrolladores.com/7156/duda-en-comparar-registro_entrada-con-el-turno_entrada?show=7156


  • Primero obten los horarios de la tabla HORARIOS, guardalos en una variable, recuerda que para obtener la fecha con la hora debes usar resultSet.getTimestamp("COLUMNA_TABLA").

  • Lo siguiente es hacer una consulta obteniendo el empleado y las horas de su asistencia.

  • En la consulta del empleado y sus horarios guardamos en una variable. resultSet.getTimestamp("HORA_ENTRADA")

  • Ahora guardamos en una variable las diferencias de los 4 horarios, como pude ver en tu codigo existen 4 diferencias en horarios,
    • 1.- Horario asistencia entrada
    • 2.- Horario asistencia salida
    • 3.- Horario comida comienzo
    • 4.- Horario comida finalizacion
      .
  • para obtener la diferencia en minutos restamos el tiempo en milisegundos de la hora del empleado menos la hora del horario y usamos TimeUnit. TimeUnit.MILLISECONDS.toMinutes( HORA ENTRADA EMPLEADO - HORA ENTRADA HORARIO )

El codigo de ejemplo:

He comentado el código para que sepas que hize en cada linea, yo guardo las diferencias en minutos en un HashMap para que el código se entienda mejor.

PreparedStatement pstmt = null;
ResultSet rs = null;
int horario_id = 1; // cambiar esto (?
int id_empleado_aux = 1; // cambiar esto (?
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

/* establecemos el hashmap para los horarios */
HashMap<String, Date> horarios = new HashMap<>();

/* Consultamos el horario */
try
{
    pstmt = connection.prepareStatement("SELECT * " +
                                        "FROM HORARIOS " +
                                        "WHERE ID_HORARIO = ?");
    pstmt.setInt(1, horario_id);
    rs = pstmt.executeQuery();

    if( rs.next() )
    {
        /* guardamos las fechas de los horarios en el hashmap */

        horarios.put("asistencia_entrada", rs.getTimestamp("HORARIO_ENTRADA"));
        horarios.put("asistencia_salida", rs.getTimestamp("HORARIO_SALIDA"));
        horarios.put("comida_comienzo", rs.getTimestamp("HORARIO_COMIENZO_COMIDA"));
        horarios.put("comida_termino", rs.getTimestamp("HORARIO_TERMINO_COMIDA"));
    }

    pstmt.close();
    rs.close();

} catch(Exception e){ System.out.println(e.getMessage()); }

try
{
    pstmt = connection.prepareStatement(/* SELECT */
                                        "SELECT A.ID_ASISTENCIA, E.APELLIDO_PATERNO, E.APELLIDO_MATERNO, " +
                                        "E.NOMBRE, A.HORA_ENTRADA, A.HORA_SALIDA, A.HORA_COMIENZO_COMIDA, " +
                                        "A.HORA_TERMINO_COMIDA " +
                                        /* FROM */
                                        "FROM ASISTENCIA AS A, EMPLEADOS AS E " +
                                        /* WHERE */
                                        "WHERE E.ID_EMPLEADO = ?");
    pstmt.setInt(1, id_empleado_aux);

    rs = pstmt.executeQuery();

    while ( rs.next() )
    {
        String nombre = rs.getString("NOMBRE");
        Date horaEntrada = rs.getTimestamp("HORA_ENTRADA");
        Date horaSalida = rs.getTimestamp("HORA_SALIDA");
        Date horaComienzoComida = rs.getTimestamp("HORA_COMIENZO_COMIDA");
        Date horaTerminoComida = rs.getTimestamp("HORA_TERMINO_COMIDA");

        /* restamos y definimos las diferencias para los horarios */

        // diferencia entrada asistencia
        long diferenciaEntrada = (
                horaEntrada.getTime() -
                horarios.get("asistencia_entrada").getTime());

        // diferencia salida asistencia
        long diferenciaSalida = (
                horaSalida.getTime() -
                horarios.get("asistencia_salida").getTime());

        // diferencia comienzo comida
        long diferenciaComida = (
                horaComienzoComida.getTime() -
                horarios.get("comida_comienzo").getTime());

        // diferencia comienzo comida
        long diferenciaTerminoComida = (
                horaTerminoComida.getTime() -
                horarios.get("comida_termino").getTime());

        /* definimos el hashmap para las diferencias de los horarios */
        HashMap<String, Long> diferencias = new HashMap<>();

        // guardamos en el hashmap la diferencia en minutos
        diferencias.put("asistencia_entrada", TimeUnit.MILLISECONDS.toMinutes(diferenciaEntrada));
        diferencias.put("asistencia_salida", TimeUnit.MILLISECONDS.toMinutes(diferenciaSalida));
        diferencias.put("comida_comienzo", TimeUnit.MILLISECONDS.toMinutes(diferenciaComida));
        diferencias.put("comida_termino", TimeUnit.MILLISECONDS.toMinutes(diferenciaTerminoComida));

        for (HashMap.Entry<String, Long> entry : diferencias.entrySet()) {

            System.out.printf("diferencia %s: %d minutos", entry.getKey(), entry.getValue());
            System.out.println();
        }
    }

    pstmt.close();
    rs.close();
    connection.close();

} catch(Exception e){ System.out.println(e.getMessage()); }

Del HashMap diferencias obtienes las 4 diferencias antes dichas en minutos.

if(diferencias.get("asistencia_entrada") > 0)
{
    // empleado atrasado
}

saludos!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta