La función TIME() extrae el componente de hora de un valor DATETIME, TIMESTAMP o cadena con formato temporal, devolviendo un resultado de tipo TIME con formato HH:MM:SS. Es la contraparte directa de DATE(): mientras aquella aísla la fecha descartando la hora, TIME() aísla la hora descartando la fecha.
Esta función resulta indispensable cuando necesitas analizar patrones horarios sin importar en qué día ocurrieron los eventos. Por ejemplo, determinar las horas pico de un restaurante, identificar a qué hora se concentran más errores en un sistema o filtrar transacciones realizadas dentro de un horario específico.
Sintaxis
TIME(expresion)El argumento expresion puede ser un valor de tipo TIME, DATETIME, TIMESTAMP o una cadena que MySQL interprete como un valor temporal. Si la entrada ya es de tipo TIME, se devuelve sin cambios.
Comportamiento básico
La operación fundamental de TIME() consiste en separar la hora del componente de fecha.
SELECT TIME('2025-07-15 14:32:08') AS solo_hora;| solo_hora |
|---|
| 14:32:08 |
Cuando se aplica a una columna DATETIME, descarta la fecha y conserva solo horas, minutos y segundos.
SELECT fecha_pedido,
TIME(fecha_pedido) AS hora_pedido
FROM pedidos
LIMIT 4;| fecha_pedido | hora_pedido |
|---|---|
| 2025-07-12 18:40:55 | 18:40:55 |
| 2025-07-14 09:15:22 | 09:15:22 |
| 2025-07-15 14:32:08 | 14:32:08 |
| 2025-07-15 14:32:08 | 14:32:08 |
Si el valor incluye fracciones de segundo, TIME() las preserva.
SELECT TIME('2025-07-15 14:32:08.451293') AS con_fracciones;| con_fracciones |
|---|
| 14:32:08.451293 |
Si la entrada ya es un valor TIME, la función lo retorna tal cual.
SELECT TIME('09:30:00') AS ya_es_hora;| ya_es_hora |
|---|
| 09:30:00 |
Caso práctico: analizar patrones horarios de ventas
Un caso de uso frecuente es identificar las horas del día con mayor actividad comercial. Al extraer la hora de los timestamps de venta, puedes agrupar y contar las transacciones por franja horaria.
SELECT HOUR(TIME(v.fecha_venta)) AS hora,
COUNT(*) AS num_ventas,
SUM(v.cantidad * v.precio_unitario) AS ingresos
FROM ventas v
WHERE v.fecha_venta >= '2025-07-01'
GROUP BY HOUR(TIME(v.fecha_venta))
ORDER BY hora;| hora | num_ventas | ingresos |
|---|---|---|
| 9 | 23 | 3450.80 |
| 10 | 45 | 6720.50 |
| 11 | 62 | 9180.25 |
| 12 | 78 | 11540.00 |
| 13 | 71 | 10620.75 |
| 14 | 55 | 8230.40 |
| 15 | 40 | 5960.30 |
| 16 | 38 | 5670.10 |
| 17 | 52 | 7780.60 |
| 18 | 65 | 9720.45 |
| 19 | 58 | 8670.20 |
| 20 | 34 | 5080.50 |
Este análisis revela claramente que las horas pico de ventas son entre las 11:00 y las 13:00 y luego de nuevo entre las 17:00 y las 19:00, un patrón típico en comercios con horario extendido.
Aunque HOUR(fecha_venta) produciría el mismo resultado sin necesidad de TIME(), usar ambas funciones hace la intención explícita: primero extraer la hora completa y luego su componente de hora. En consultas más complejas, esta claridad resulta valiosa.
Caso práctico: filtrar por rangos horarios
TIME() permite filtrar registros que ocurrieron dentro de una franja horaria específica, independientemente del día. Esto es útil para auditorías o para detectar actividad fuera de horario.
SELECT p.id, p.cliente_id, p.total, p.fecha_pedido,
TIME(p.fecha_pedido) AS hora
FROM pedidos p
WHERE TIME(p.fecha_pedido) BETWEEN '22:00:00' AND '23:59:59'
OR TIME(p.fecha_pedido) BETWEEN '00:00:00' AND '05:59:59'
ORDER BY TIME(p.fecha_pedido);| id | cliente_id | total | fecha_pedido | hora |
|---|---|---|---|---|
| 34 | 876 | 45.00 | 2025-07-03 01:22:15 | 01:22:15 |
| 52 | 912 | 120.50 | 2025-07-08 23:45:02 | 23:45:02 |
Esta consulta identifica pedidos realizados fuera del horario comercial habitual, lo que podría señalar compras online de madrugada o actividad sospechosa según el contexto del negocio.
Para crear ventanas horarias con etiquetas descriptivas, combina TIME() con CASE.
SELECT p.id, p.total, TIME(p.fecha_pedido) AS hora,
CASE
WHEN TIME(p.fecha_pedido) < '12:00:00' THEN 'Mañana'
WHEN TIME(p.fecha_pedido) < '18:00:00' THEN 'Tarde'
ELSE 'Noche'
END AS turno
FROM pedidos p
WHERE fecha_pedido >= '2025-07-15'
ORDER BY p.fecha_pedido;| id | total | hora | turno |
|---|---|---|---|
| 86 | 259.90 | 14:32:08 | Tarde |
| 87 | 84.50 | 14:32:08 | Tarde |
Caso práctico: calcular diferencias de tiempo
Al extraer la parte de hora de dos timestamps, puedes calcular la duración de un evento sin que la fecha interfiera, siempre y cuando el evento ocurra dentro del mismo día.
SELECT e.nombre,
TIME(ra.hora_entrada) AS entrada,
TIME(COALESCE(ra.hora_salida, CURTIME())) AS salida,
TIMEDIFF(
TIME(COALESCE(ra.hora_salida, CURTIME())),
TIME(ra.hora_entrada)
) AS duracion
FROM registros_asistencia ra
JOIN empleados e ON e.id = ra.empleado_id
WHERE ra.fecha = CURDATE();| nombre | entrada | salida | duracion |
|---|---|---|---|
| Carlos Ruiz | 08:47:22 | 17:30:00 | 08:42:38 |
| Ana Martínez | 09:03:15 | 17:15:45 | 08:12:30 |
| Pedro Sánchez | 09:22:40 | 18:00:10 | 08:37:30 |
Cabe notar que TIMEDIFF trabaja directamente con valores TIME, por lo que la combinación con TIME() es natural cuando partes de valores DATETIME.
Manejo de NULL
Si el argumento de TIME() es NULL, la función devuelve NULL.
SELECT TIME(NULL) AS resultado;| resultado |
|---|
| NULL |
Esto aplica también cuando la columna de entrada contiene valores nulos.
SELECT id, fecha_envio,
TIME(fecha_envio) AS hora_envio
FROM pedidos;| id | fecha_envio | hora_envio |
|---|---|---|
| 86 | 2025-07-15 16:45:33 | 16:45:33 |
| 87 | NULL | NULL |
Para manejar los nulos, aplica COALESCE o IFNULL según la lógica de negocio.
SELECT id,
TIME(COALESCE(fecha_envio, fecha_pedido)) AS hora_referencia
FROM pedidos;| id | hora_referencia |
|---|---|
| 86 | 16:45:33 |
| 87 | 14:32:08 |
Cuando TIME() recibe una cadena no válida como argumento, devuelve NULL y genera una advertencia.
SELECT TIME('no-es-hora') AS invalido;| invalido |
|---|
| NULL |
Combinación con otras funciones
TIME() se integra con funciones de extracción para descomponer la hora en sus componentes individuales.
SELECT TIME(NOW()) AS hora_actual,
HOUR(TIME(NOW())) AS horas,
MINUTE(TIME(NOW())) AS minutos,
SECOND(TIME(NOW())) AS segundos;| hora_actual | horas | minutos | segundos |
|---|---|---|---|
| 14:32:08 | 14 | 32 | 8 |
Para mostrar la hora en formato de 12 horas con AM/PM, combina TIME() con TIME_FORMAT.
SELECT TIME(fecha_pedido) AS hora_24,
TIME_FORMAT(TIME(fecha_pedido), '%h:%i:%s %p') AS hora_12
FROM pedidos
LIMIT 3;| hora_24 | hora_12 |
|---|---|
| 18:40:55 | 06:40:55 PM |
| 09:15:22 | 09:15:22 AM |
| 14:32:08 | 02:32:08 PM |
La aritmética temporal también funciona con los resultados de TIME(). Puedes sumar o restar intervalos usando ADDTIME y SUBTIME.
SELECT TIME(fecha_pedido) AS hora_original,
ADDTIME(TIME(fecha_pedido), '01:30:00') AS mas_hora_y_media,
SUBTIME(TIME(fecha_pedido), '00:45:00') AS menos_45_min
FROM pedidos
WHERE id = 86;| hora_original | mas_hora_y_media | menos_45_min |
|---|---|---|
| 14:32:08 | 16:02:08 | 13:47:08 |
En el siguiente artículo veremos DATE_FORMAT para dar formato personalizado a las fechas.
Escrito por Eduardo Lázaro
