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

¿Que tipo de dato en mysql puedo utilizar para manejar horas en el formato (HH:mm:ss)?

Buen dia a todos; en este momento me surgio la duda estoy realizando una aplicacion web utilizando JSP y servlets usando mvc, en el manejo de la administracion de horas de un empleado, registre la horas de entradas y horas de salidas, en mi base de datos en mysql tengo la tabla se llama registro y tiene los datos id_registro de tipo int auto incrementable,fecha_registro de tipo date,hora_entrada de tipo time ,hora_salida de tipo time,total_horas_retardo de tipo time; en mi clase modeloregistrar_empleado.java tengo declaradas mis variables como tipo String hora_entrada,String hora_salida, pero al momento de realizar la condicion si (hora_entrada > 9:00:00) si cumple esto que solo sume los minutos y se vayan alamacenando en el campo de mi tabla total_horas, la pregunta es ¿Seria correcto convertir mis variables string a tipo time?, o alguna sugerencia que me puedan comentar; si alguien ha manejado la comparacion de horas y sumar los minutos????

2 Respuestas

2votos

Leonardo-Tadei Puntos227010

Hola Cristi_C,

con la tabla que describís, estás violando las reglas de Normalización de almacenamiento de base de datos... y además compplicándote la vida.

La tabla correcta para este escenario es:

Tabla: Registro
----------------------
id_registro (int, unsigned, auto_incremental, primary key)
id_empleado (del mismo tipo que el ID de la tabla de empleados)
entrada (datetime)
salida (datetime)

Con esto, respetás la 1ra Forma Normal, que dice que cada dato debe estar en un campo. En tu aproximación, tenías un dato (el horario de entrada es la fecha y la hora, no solo la hora) en dos campos, lo mismo el de salida, y tenés una repetición al guardar el tiempo de trabajo, ya que ese dato es un cálculo sobre dos datos existentes.

Luego, para saber las horas trabajadas, solo tenés que hacer una query sobre la tabla y no almacenarla en otro lugar...

A partir de ahí, si trabajás todas las fechas en formato fecha de Java (no como string) podés hacer los cálculos que quieras y formateando la salida, mostrarla como te haga falta.

Saludos cordiales!

0voto

Cristi_C comentado

Muchas Gracias Leonardo-Tadei me has resuelto las dudas

1voto

GusGarsaky Puntos5480

Creo que ésto debería funcionar. Primero convertimos las horas a milisegundos para poder compararlas y finalmente a la diferencia de dichas horas (si es que la fecha de entrada de la persona es mayor a la oficial) que están también en milisegundos las convertimos a minutos y los retornamos.

import java.util.concurrent.TimeUnit.*;

/**
 *
 @return [int] Si el retorno es igual a 0, no hay minutos extras
 *
 */
public int getLateMinutes(Date entryTime)
{
    int minutes = 0;
    Date officialEntryTime = new SimpleDateFormatter("H:mm").format("9:00");
    if(entryTime.getTime() > officialEntryTime.getTime())
    {
        // getTime() convierte la hora a milisegundos
        difference = entryTime.getTime() - officialEntryTime.getTime();
        // como la diferencia está en milisegundos, lo convertimos a minutos
        minutes = TimeUnit.MILLISECONDS.toMinutes(difference);
    }
    return minutes;
}

0voto

Cristi_C comentado

Para esto tendria que utilizar el tipo de dato datetime en mysql que maneja la fecha y hora

0voto

GusGarsaky comentado

Claro. Podrías usar la función:

 MYSQL_DATE_FORMAT(date, "%H:%i")

de MySQL para convertir una fecha a formato HH:mm.

Así mismo, si no tienes una hora en ese formato pero quieres obtenerla así, solo usas la función en tu consulta:

SELECT DATE_FORMAT(date_column, '%H:%i') FROM tabla

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

Otras Preguntas y Respuestas


Actividad Reciente

...

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

Conecta