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_pedidohora_pedido
2025-07-12 18:40:5518:40:55
2025-07-14 09:15:2209:15:22
2025-07-15 14:32:0814:32:08
2025-07-15 14:32:0814: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;
horanum_ventasingresos
9233450.80
10456720.50
11629180.25
127811540.00
137110620.75
14558230.40
15405960.30
16385670.10
17527780.60
18659720.45
19588670.20
20345080.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);
idcliente_idtotalfecha_pedidohora
3487645.002025-07-03 01:22:1501:22:15
52912120.502025-07-08 23:45:0223: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;
idtotalhoraturno
86259.9014:32:08Tarde
8784.5014:32:08Tarde

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();
nombreentradasalidaduracion
Carlos Ruiz08:47:2217:30:0008:42:38
Ana Martínez09:03:1517:15:4508:12:30
Pedro Sánchez09:22:4018:00:1008: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;
idfecha_enviohora_envio
862025-07-15 16:45:3316:45:33
87NULLNULL

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;
idhora_referencia
8616:45:33
8714: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_actualhorasminutossegundos
14:32:0814328

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_24hora_12
18:40:5506:40:55 PM
09:15:2209:15:22 AM
14:32:0802: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_originalmas_hora_y_mediamenos_45_min
14:32:0816:02:0813:47:08

En el siguiente artículo veremos DATE_FORMAT para dar formato personalizado a las fechas.

Escrito por Eduardo Lázaro