TIME almacena un valor de tiempo en formato HH:MM:SS. A diferencia de lo que su nombre sugiere, no solo representa horas del reloj (00:00:00 a 23:59:59) sino también duraciones y diferencias temporales, con un rango amplio de -838:59:59 a 838:59:59. Ocupa 3 bytes.
Sintaxis
CREATE TABLE nombre_tabla ( columna TIME NOT NULL);-- Con precisión de fracciones de segundo (0-6)columna TIME(3) -- Milisegundoscolumna TIME(6) -- Microsegundos
Ejemplo básico
CREATE TABLE horarios ( id INT AUTO_INCREMENT PRIMARY KEY, actividad VARCHAR(100) NOT NULL, hora_inicio TIME NOT NULL, hora_fin TIME NOT NULL, duracion TIME);INSERT INTO horarios (actividad, hora_inicio, hora_fin, duracion) VALUES('Reunión equipo', '09:00:00', '10:30:00', '01:30:00'),('Almuerzo', '13:00:00', '14:00:00', '01:00:00'),('Formación SQL', '15:00:00', '17:00:00', '02:00:00'),('Guardia nocturna', '22:00:00', '06:00:00', '08:00:00');SELECT * FROM horarios;
id
actividad
hora_inicio
hora_fin
duracion
1
Reunión equipo
09:00:00
10:30:00
01:30:00
2
Almuerzo
13:00:00
14:00:00
01:00:00
3
Formación SQL
15:00:00
17:00:00
02:00:00
4
Guardia nocturna
22:00:00
06:00:00
08:00:00
Obtener la hora actual
SELECT CURTIME() AS ahora, CURRENT_TIME() AS ahora_alt, CURTIME(3) AS con_milisegundos;
ahora
ahora_alt
con_milisegundos
14:30:45
14:30:45
14:30:45.123
Extraer partes del tiempo
SELECT '14:30:45' AS tiempo, HOUR('14:30:45') AS hora, MINUTE('14:30:45') AS minuto, SECOND('14:30:45') AS segundo;
tiempo
hora
minuto
segundo
14:30:45
14
30
45
TIME como duración
TIME puede representar duraciones que exceden las 24 horas:
CREATE TABLE tareas ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, tiempo_estimado TIME NOT NULL, tiempo_real TIME);INSERT INTO tareas (nombre, tiempo_estimado, tiempo_real) VALUES('Migración de BD', '48:00:00', '52:30:00'),('Deploy producción', '02:00:00', '01:45:00'),('Code review', '04:00:00', '03:15:00'),('Testing completo', '24:00:00', '28:00:00');SELECT nombre, tiempo_estimado, tiempo_real, TIMEDIFF(tiempo_real, tiempo_estimado) AS diferenciaFROM tareas;
nombre
tiempo_estimado
tiempo_real
diferencia
Migración de BD
48:00:00
52:30:00
04:30:00
Deploy producción
02:00:00
01:45:00
-00:15:00
Code review
04:00:00
03:15:00
-00:45:00
Testing completo
24:00:00
28:00:00
04:00:00
Los valores negativos indican que la tarea se completó antes de lo estimado.
Aritmética con TIME
ADDTIME y SUBTIME
SELECT '09:00:00' AS inicio, ADDTIME('09:00:00', '02:30:00') AS mas_dos_y_media, SUBTIME('17:00:00', '01:15:00') AS menos_una_y_cuarto;
inicio
mas_dos_y_media
menos_una_y_cuarto
09:00:00
11:30:00
15:45:00
TIMEDIFF
Calcula la diferencia entre dos tiempos:
SELECT hora_inicio, hora_fin, TIMEDIFF(hora_fin, hora_inicio) AS duracion_calcFROM horariosWHERE id IN (1, 2, 3);
hora_inicio
hora_fin
duracion_calc
09:00:00
10:30:00
01:30:00
13:00:00
14:00:00
01:00:00
15:00:00
17:00:00
02:00:00
TIME_TO_SEC y SEC_TO_TIME
Convierte entre TIME y segundos para operaciones aritméticas:
SELECT '02:30:00' AS tiempo, TIME_TO_SEC('02:30:00') AS en_segundos, SEC_TO_TIME(9000) AS de_segundos;
tiempo
en_segundos
de_segundos
02:30:00
9000
02:30:00
-- Sumar duraciones usando segundosSELECT SEC_TO_TIME(SUM(TIME_TO_SEC(duracion))) AS duracion_totalFROM horarios;
duracion_total
12:30:00
Formatear TIME
SELECT TIME_FORMAT('14:30:45', '%H:%i') AS hora_minuto, TIME_FORMAT('14:30:45', '%h:%i %p') AS formato_12h, TIME_FORMAT('14:30:45', '%H horas %i minutos') AS descriptivo;
hora_minuto
formato_12h
descriptivo
14:30
02:30 PM
14 horas 30 minutos
TIME con fracciones de segundo
CREATE TABLE cronometro ( id INT AUTO_INCREMENT PRIMARY KEY, corredor VARCHAR(50), tiempo TIME(3) NOT NULL);INSERT INTO cronometro (corredor, tiempo) VALUES('Ana', '00:03:45.123'),('Luis', '00:03:44.890'),('Pedro', '00:03:46.001');SELECT corredor, tiempo FROM cronometro ORDER BY tiempo;
corredor
tiempo
Luis
00:03:44.890
Ana
00:03:45.123
Pedro
00:03:46.001
TIME(3) almacena hasta milisegundos. TIME(6) almacena microsegundos. El almacenamiento adicional es de 1-3 bytes según la precisión.
Valores de TIME desde enteros y cadenas
MySQL acepta varios formatos al insertar un valor TIME:
SELECT CAST('14:30:00' AS TIME) AS desde_cadena, CAST('1430' AS TIME) AS sin_separadores, CAST(143000 AS TIME) AS desde_entero;
desde_cadena
sin_separadores
desde_entero
14:30:00
00:14:30
14:30:00
Cuidado: '1430' como cadena se interpreta como 14 minutos y 30 segundos (00:14:30), no como 14:30:00. Para evitar ambigüedades, usa siempre el formato completo HH:MM:SS.
Limpieza
DROP TABLE IF EXISTS horarios;DROP TABLE IF EXISTS tareas;DROP TABLE IF EXISTS cronometro;
En el siguiente artículo veremos DATETIME, que combina fecha y hora en un solo valor.