TIME_TO_SEC
La función TIME_TO_SEC convierte un valor de tiempo en su equivalente total en segundos. Toma un valor TIME en formato HH:MM:SS y devuelve el número entero de segundos que representa, calculado como horas * 3600 + minutos * 60 + segundos. Esta conversión es esencial cuando necesitas realizar aritmética precisa con tiempos, comparar duraciones de forma numérica o almacenar tiempos como valores enteros para cálculos eficientes.
Trabajar con tiempos directamente en formato HH:MM:SS puede ser limitante para ciertos cálculos. Al convertir a segundos, obtienes un número simple sobre el que puedes sumar, restar, promediar y hacer cualquier operación aritmética, para luego convertir el resultado de vuelta a formato de tiempo con la función inversa SEC_TO_TIME.
Sintaxis
TIME_TO_SEC(time)El argumento time es un valor de tipo TIME o una expresión que MySQL pueda interpretar como tiempo. La función devuelve un entero que representa el total de segundos. Para valores de tiempo negativos (que MySQL permite en el rango de -838:59:59 a 838:59:59), el resultado también es negativo.
Comportamiento básico
La conversión sigue una fórmula simple pero que resulta muy práctica al aplicarla en consultas.
SELECT
TIME_TO_SEC('01:00:00') AS una_hora,
TIME_TO_SEC('00:30:00') AS treinta_minutos,
TIME_TO_SEC('00:01:00') AS un_minuto,
TIME_TO_SEC('00:00:01') AS un_segundo;| una_hora | treinta_minutos | un_minuto | un_segundo |
|---|---|---|---|
| 3600 | 1800 | 60 | 1 |
Una hora equivale a 3600 segundos, media hora a 1800 y así sucesivamente. Para valores más complejos, la función suma todas las partes.
SELECT
TIME_TO_SEC('08:30:45') AS jornada_parcial,
TIME_TO_SEC('23:59:59') AS casi_un_dia,
TIME_TO_SEC('24:00:00') AS un_dia_exacto;| jornada_parcial | casi_un_dia | un_dia_exacto |
|---|---|---|
| 30645 | 86399 | 86400 |
El valor 86400 representa exactamente 24 horas, una referencia útil para saber que un día completo tiene 86400 segundos.
MySQL también permite valores de tiempo que excedan las 24 horas y valores negativos.
SELECT
TIME_TO_SEC('100:30:00') AS cien_horas_y_media,
TIME_TO_SEC('-02:30:00') AS negativo;| cien_horas_y_media | negativo |
|---|---|
| 361800 | -9000 |
Caso práctico: calcular duración de llamadas en un call center
Un centro de atención al cliente registra la hora de inicio y fin de cada llamada. Convertir a segundos permite calcular la duración exacta y hacer estadísticas.
SELECT
l.id,
l.agente,
l.hora_inicio,
l.hora_fin,
TIME_TO_SEC(TIMEDIFF(l.hora_fin, l.hora_inicio)) AS duracion_segundos,
ROUND(TIME_TO_SEC(TIMEDIFF(l.hora_fin, l.hora_inicio)) / 60, 1) AS duracion_minutos
FROM llamadas l
WHERE l.fecha = CURDATE()
ORDER BY duracion_segundos DESC
LIMIT 5;| id | agente | hora_inicio | hora_fin | duracion_segundos | duracion_minutos |
|---|---|---|---|---|---|
| 4521 | Ana Martínez | 10:15:30 | 10:42:15 | 1605 | 26.8 |
| 4518 | Carlos López | 09:30:00 | 09:48:22 | 1102 | 18.4 |
| 4525 | Laura Gómez | 11:00:05 | 11:15:33 | 928 | 15.5 |
| 4520 | Pedro Sánchez | 10:00:00 | 10:12:45 | 765 | 12.8 |
| 4523 | Ana Martínez | 14:20:00 | 14:28:10 | 490 | 8.2 |
Al expresar la duración en segundos, puedes dividir fácilmente entre 60 para obtener minutos, y la función ROUND permite controlar los decimales.
Caso práctico: promedio de tiempo de respuesta
El mismo call center necesita conocer el tiempo promedio de atención por agente. Promediar tiempos directamente no es posible con AVG, pero al convertir a segundos sí lo es.
SELECT
l.agente,
COUNT(*) AS total_llamadas,
SEC_TO_TIME(
ROUND(AVG(TIME_TO_SEC(TIMEDIFF(l.hora_fin, l.hora_inicio))))
) AS tiempo_promedio,
SEC_TO_TIME(
MIN(TIME_TO_SEC(TIMEDIFF(l.hora_fin, l.hora_inicio)))
) AS llamada_mas_corta,
SEC_TO_TIME(
MAX(TIME_TO_SEC(TIMEDIFF(l.hora_fin, l.hora_inicio)))
) AS llamada_mas_larga
FROM llamadas l
WHERE l.fecha = CURDATE()
GROUP BY l.agente
ORDER BY tiempo_promedio;| agente | total_llamadas | tiempo_promedio | llamada_mas_corta | llamada_mas_larga |
|---|---|---|---|---|
| Pedro Sánchez | 18 | 00:08:25 | 00:02:10 | 00:15:33 |
| Laura Gómez | 15 | 00:10:12 | 00:03:45 | 00:22:08 |
| Carlos López | 22 | 00:12:30 | 00:01:55 | 00:28:42 |
| Ana Martínez | 12 | 00:15:48 | 00:05:20 | 00:42:15 |
El patrón es claro: conviertes a segundos con TIME_TO_SEC, aplicas la función de agregación (AVG, MIN, MAX), y luego reconviertes a formato legible con SEC_TO_TIME. Este flujo es la forma estándar de hacer cálculos estadísticos con tiempos en MySQL.
Caso práctico: comparar tiempos numéricamente
Cuando necesitas filtrar o comparar tiempos de forma numérica, convertir a segundos simplifica las condiciones. Por ejemplo, encontrar todos los turnos que exceden las 8 horas de trabajo.
SELECT
e.nombre,
e.hora_entrada,
e.hora_salida,
SEC_TO_TIME(
TIME_TO_SEC(e.hora_salida) - TIME_TO_SEC(e.hora_entrada)
) AS horas_trabajadas,
CASE
WHEN TIME_TO_SEC(e.hora_salida) - TIME_TO_SEC(e.hora_entrada) > 28800
THEN 'Horas extra'
WHEN TIME_TO_SEC(e.hora_salida) - TIME_TO_SEC(e.hora_entrada) = 28800
THEN 'Jornada completa'
ELSE 'Jornada parcial'
END AS tipo_jornada
FROM registro_asistencia e
WHERE e.fecha = CURDATE()
ORDER BY horas_trabajadas DESC
LIMIT 5;| nombre | hora_entrada | hora_salida | horas_trabajadas | tipo_jornada |
|---|---|---|---|---|
| Ana Martínez | 07:00:00 | 17:30:00 | 10:30:00 | Horas extra |
| Carlos López | 08:00:00 | 17:00:00 | 09:00:00 | Horas extra |
| Laura Gómez | 09:00:00 | 17:00:00 | 08:00:00 | Jornada completa |
| Pedro Sánchez | 09:00:00 | 15:30:00 | 06:30:00 | Jornada parcial |
| María Ruiz | 10:00:00 | 14:00:00 | 04:00:00 | Jornada parcial |
El valor 28800 es el equivalente en segundos a 8 horas (8 * 3600). Comparar contra este número es más eficiente y claro que intentar comparar directamente con el valor TIME de '08:00:00'.
SEC_TO_TIME: la función inversa
SEC_TO_TIME es la función complementaria que convierte un número de segundos de vuelta a formato TIME. Juntas forman un par indispensable para el cálculo con tiempos.
SELECT
SEC_TO_TIME(3600) AS una_hora,
SEC_TO_TIME(5400) AS hora_y_media,
SEC_TO_TIME(45296) AS complejo,
SEC_TO_TIME(-7200) AS negativo;| una_hora | hora_y_media | complejo | negativo |
|---|---|---|---|
| 01:00:00 | 01:30:00 | 12:34:56 | -02:00:00 |
Manejo de NULL
TIME_TO_SEC devuelve NULL cuando recibe un argumento NULL.
SELECT
TIME_TO_SEC(NULL) AS resultado_nulo,
TIME_TO_SEC('00:00:00') AS medianoche;| resultado_nulo | medianoche |
|---|---|
| NULL | 0 |
Cuando trabajas con columnas que pueden ser nulas, usa COALESCE para evitar que los NULL afecten las funciones de agregación.
SELECT
agente,
ROUND(
AVG(COALESCE(TIME_TO_SEC(duracion_llamada), 0))
) AS promedio_segundos
FROM llamadas
GROUP BY agente;| agente | promedio_segundos |
|---|---|
| Ana Martínez | 948 |
| Carlos López | 750 |
| Laura Gómez | 612 |
Sin COALESCE, las filas con duracion_llamada nula serían ignoradas por AVG. Con COALESCE, se cuentan como 0 segundos, lo cual puede ser más apropiado dependiendo del contexto del negocio.
Combinación con otras funciones
TIME_TO_SEC se integra bien con funciones aritméticas y de agregación para resolver problemas complejos de cálculo temporal.
SELECT
CONCAT(
FLOOR(SUM(TIME_TO_SEC(duracion)) / 3600), 'h ',
FLOOR(MOD(SUM(TIME_TO_SEC(duracion)), 3600) / 60), 'm'
) AS tiempo_total_legible,
SUM(TIME_TO_SEC(duracion)) AS total_segundos,
COUNT(*) AS total_tareas
FROM tareas
WHERE proyecto_id = 15
AND fecha = CURDATE();| tiempo_total_legible | total_segundos | total_tareas |
|---|---|---|
| 6h 45m | 24300 | 8 |
En este ejemplo, SUM acumula todos los tiempos en segundos, y luego se descompone en horas y minutos usando FLOOR y MOD para presentar un resumen legible. Este patrón es muy común en sistemas de seguimiento de tiempo y gestión de proyectos.
Con esto completamos las funciones de fecha de MySQL. En la siguiente sección veremos las funciones de agregación.
Escrito por Eduardo Lázaro
