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_horatreinta_minutosun_minutoun_segundo
36001800601

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_parcialcasi_un_diaun_dia_exacto
306458639986400

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_medianegativo
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;
idagentehora_iniciohora_finduracion_segundosduracion_minutos
4521Ana Martínez10:15:3010:42:15160526.8
4518Carlos López09:30:0009:48:22110218.4
4525Laura Gómez11:00:0511:15:3392815.5
4520Pedro Sánchez10:00:0010:12:4576512.8
4523Ana Martínez14:20:0014:28:104908.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;
agentetotal_llamadastiempo_promediollamada_mas_cortallamada_mas_larga
Pedro Sánchez1800:08:2500:02:1000:15:33
Laura Gómez1500:10:1200:03:4500:22:08
Carlos López2200:12:3000:01:5500:28:42
Ana Martínez1200:15:4800:05:2000: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;
nombrehora_entradahora_salidahoras_trabajadastipo_jornada
Ana Martínez07:00:0017:30:0010:30:00Horas extra
Carlos López08:00:0017:00:0009:00:00Horas extra
Laura Gómez09:00:0017:00:0008:00:00Jornada completa
Pedro Sánchez09:00:0015:30:0006:30:00Jornada parcial
María Ruiz10:00:0014:00:0004:00:00Jornada 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_horahora_y_mediacomplejonegativo
01:00:0001:30:0012: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_nulomedianoche
NULL0

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;
agentepromedio_segundos
Ana Martínez948
Carlos López750
Laura Gómez612

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_legibletotal_segundostotal_tareas
6h 45m243008

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