Hola, chicos,
¡Buenas noches!

En la publicación de hoy demostraré cómo convertir el tiempo almacenado como un número entero en una columna de tiempo. Tuve la idea de escribir este post cuando un compañero DBA me dijo que está manejando un sistema que usa la base de datos MySQL y tiene una tabla donde el programador decide almacenar la hora en un campo entero, de modo que las 09:30 se almacenan como 930 y las 21:20 se almacenan como 2120, por ejemplo.

Desafortunadamente, esto no fue nada nuevo para mí y esto me motivó a escribir este post, ya que puede ayudar a otras personas, ya sea el DBA, a poder trabajar con estos datos o al Desarrollador, para que pueda usar el campo de fecha y hora o de hora para almacenar este tipo de información.

Simulando la base de prueba

Para que puedas simular este problema en casa, decidí poner a disposición este sencillo script:

-- Cria a tabela de teste
DROP TABLE IF EXISTS `teste`;

CREATE TABLE `teste` (
  `descricao` VARCHAR(60) COLLATE utf8_unicode_ci NOT NULL,
  `hora_int` INT(11) NOT NULL,
  `hora` TIME DEFAULT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

-- Insere os dados
INSERT INTO `teste`(descricao, hora_int) VALUES('Teste 09:30', 930), ('Teste 13:42', 1342), ('Teste 21:53', 2153);

-- Exibe os dados
SELECT * FROM `teste`;

Resultado:

MySQL Convert Time Int
MySQL Convertir tiempo int

Convertir el tiempo almacenado como una columna INT a TIME

Después de hacer esta introducción y publicar el script de prueba, ahora demostraré cómo realizar esta conversión de un número entero a un tiempo.

Usando CONVERTIR
Una forma rápida de hacer esto es usar la función CONVERTIR de MySQL para convertir el número a HORA. Si intentamos realizar la conversión directamente, MySQL transformará los datos, pero entenderá que los datos están representados en el formato mm:ss, como se muestra en la siguiente impresión:

MySQL Convert Time Int 2
MySQL Convertir tiempo int 2

Para que entienda que nuestro formato de hora es HH:mm:ss, multiplicaré el número por 100, de modo que el “minuto” se convierta en una hora, el “segundo” se convierta en un minuto y los segundos se pondrán a cero.

MySQL Convert Time Int 3
MySQL Convertir tiempo int 3

Si también almacena segundos en todo el campo, no necesita multiplicar por 100:

MySQL Convert Time Int 5
MySQL Convertir tiempo int 5

Convertir a segundos y luego usar la función SEC_TO_TIME()
Otra forma de hacer esto es:

  • Separe manualmente el valor del campo de hora (LEFT(int_hour, CHAR_LENGTH(int_hour) – 2)
  • Una vez obtenido el valor de la hora, se multiplica la hora obtenida por 3600 (60 x 60), para calcular el número de segundos que componen la hora.
  • Separe manualmente el valor del campo de minutos (DERECHA (int_hora, 2))
  • Una vez obtenido el valor del minuto, se multiplica el minuto obtenido por 60, para calcular el número de segundos que componen los minutos.
  • Sume la cantidad de segundos en la hora a la cantidad de segundos en los minutos para calcular la cantidad total de segundos.
  • Una vez convertido a segundos, podemos usar la función SEC_TO_TIME() de MySQL para obtener el tiempo correspondiente a partir del número de segundos calculado.

MySQL Convert Time Int 4
MySQL Convertir tiempo int 4

Y ahora podemos comprobar la solución resumida:

SELECT 
    descricao, 
    hora_int, 
    CONVERT(hora_int * 100, TIME) AS time1,
    SEC_TO_TIME((LEFT(hora_int, CHAR_LENGTH(hora_int) - 2) * 3600) + (RIGHT(hora_int, 2) * 60)) AS time2
FROM 
    `teste`

Resultado final:

MySQL Convert Time Int solved
MySQL Convert Time Int resuelto

Utilicé la instrucción SELECT para mostrar el resultado final, pero puedes usarla fácilmente con UPDATE, convirtiendo de INT a TIME. En este caso recomiendo crear una nueva columna de tipo TIME, realizar el UPDATE, y si todo está bien eliminar la columna INT.

Espero que te haya gustado el post!
Si tienes alguna pregunta, déjala en los comentarios.