MAKETIME

La función MAKETIME construye un valor de tipo TIME a partir de tres componentes individuales: horas, minutos y segundos. Es el equivalente temporal de lo que MAKEDATE hace con fechas: en lugar de recordar el formato de cadena correcto, puedes ensamblar la hora desde sus partes numéricas.

En la práctica, MAKETIME es útil cuando tus datos almacenan las horas, minutos y segundos en columnas separadas (algo habitual en importaciones de hojas de cálculo o bases de datos legacy), o cuando necesitas construir horarios dinámicamente a partir de cálculos.

Sintaxis

MAKETIME(hora, minuto, segundo)

Los tres argumentos son valores enteros. La función devuelve un valor de tipo TIME. Las horas pueden ir de -838 a 838 (el rango del tipo TIME en MySQL), los minutos de 0 a 59 y los segundos de 0 a 59. Si los minutos o segundos están fuera de rango, MySQL devuelve NULL.

Comportamiento básico

Construir horas desde sus componentes es directo:

SELECT
    MAKETIME(9, 30, 0) AS mañana,
    MAKETIME(14, 15, 45) AS tarde,
    MAKETIME(23, 59, 59) AS casi_medianoche,
    MAKETIME(0, 0, 0) AS medianoche;
mañanatardecasi_medianochemedianoche
09:30:0014:15:4523:59:5900:00:00

Cada componente se coloca en su posición correspondiente dentro del formato HH:MM:SS. Es importante recordar que MySQL usa el formato de 24 horas, así que las 2:15 PM se representan como 14:15.

Valores fuera de rango

MySQL es estricto con los minutos y segundos, pero flexible con las horas:

SELECT
    MAKETIME(100, 0, 0) AS cien_horas,
    MAKETIME(-5, 30, 0) AS negativa,
    MAKETIME(10, 60, 0) AS minutos_invalidos,
    MAKETIME(10, 30, 60) AS segundos_invalidos;
cien_horasnegativaminutos_invalidossegundos_invalidos
100:00:00-05:30:00NULLNULL

Las horas pueden exceder las 24 porque el tipo TIME de MySQL también se usa para representar intervalos de tiempo, no solo horas del reloj. Las horas negativas son válidas y representan un intervalo negativo. Sin embargo, 60 minutos o 60 segundos hacen que la función devuelva NULL, porque no son valores válidos dentro de una hora.

Caso práctico: unificar columnas de tiempo separadas

Un escenario muy frecuente es recibir datos donde las horas, minutos y segundos están en columnas independientes. Imagina una tabla de registros de entrada de empleados importada desde una hoja de cálculo:

SELECT
    nombre,
    hora_entrada,
    minuto_entrada,
    segundo_entrada,
    MAKETIME(hora_entrada, minuto_entrada, segundo_entrada) AS hora_completa
FROM registros_entrada
LIMIT 5;
nombrehora_entradaminuto_entradasegundo_entradahora_completa
Ana López8451208:45:12
Carlos Ruiz923309:02:33
María García830008:30:00
Pedro Sánchez9154809:15:48
Laura Martín858508:58:05

Con MAKETIME puedes combinar las tres columnas en un único valor temporal que MySQL puede comparar, ordenar y usar en cálculos de diferencia de tiempo.

Caso práctico: construir horarios de turnos

Cuando gestionas turnos de trabajo, a menudo necesitas construir los horarios de inicio y fin a partir de parámetros numéricos. MAKETIME facilita esta tarea:

SELECT
    turno,
    MAKETIME(hora_inicio, 0, 0) AS inicio,
    MAKETIME(hora_fin, 0, 0) AS fin,
    TIMEDIFF(MAKETIME(hora_fin, 0, 0), MAKETIME(hora_inicio, 0, 0)) AS duracion
FROM (
    SELECT 'Mañana' AS turno, 6 AS hora_inicio, 14 AS hora_fin
    UNION SELECT 'Tarde', 14, 22
    UNION SELECT 'Noche', 22, 6
) turnos;
turnoiniciofinduracion
Mañana06:00:0014:00:0008:00:00
Tarde14:00:0022:00:0008:00:00
Noche22:00:0006:00:00-16:00:00

Observa que el turno de noche produce una duración negativa porque la hora de fin (6:00) es menor que la de inicio (22:00). En estos casos necesitarías lógica adicional para sumar 24 horas a la diferencia, pero MAKETIME cumple su función de construir los valores de hora correctamente.

Caso práctico: combinar fecha y hora construida

Un uso potente de MAKETIME es combinarlo con una fecha para crear un valor DATETIME completo. Esto es útil cuando almacenas la fecha y la hora por separado y necesitas unirlas:

SELECT
    e.nombre,
    e.fecha_cita,
    MAKETIME(e.hora_cita, e.minuto_cita, 0) AS hora_construida,
    CAST(CONCAT(e.fecha_cita, ' ', MAKETIME(e.hora_cita, e.minuto_cita, 0)) AS DATETIME) AS cita_completa
FROM (
    SELECT 'Ana López' AS nombre, '2025-06-20' AS fecha_cita, 10 AS hora_cita, 30 AS minuto_cita
    UNION SELECT 'Carlos Ruiz', '2025-06-20', 14, 0
    UNION SELECT 'María García', '2025-06-21', 9, 15
) e;
nombrefecha_citahora_construidacita_completa
Ana López2025-06-2010:30:002025-06-20 10:30:00
Carlos Ruiz2025-06-2014:00:002025-06-20 14:00:00
María García2025-06-2109:15:002025-06-21 09:15:00

La combinación de CONCAT con CAST a DATETIME te permite crear un valor temporal completo que puedes usar en comparaciones, ordenamientos y cálculos de diferencia.

MAKETIME con NULL

Si cualquiera de los tres argumentos es NULL, la función devuelve NULL:

SELECT
    MAKETIME(NULL, 30, 0) AS hora_nula,
    MAKETIME(10, NULL, 0) AS minuto_nulo,
    MAKETIME(10, 30, NULL) AS segundo_nulo;
hora_nulaminuto_nulosegundo_nulo
NULLNULLNULL

Este comportamiento es consistente con el resto de funciones de MySQL y significa que debes validar tus datos de entrada antes de usar MAKETIME si existe la posibilidad de valores nulos en alguno de los componentes.

Combinación con otras funciones

MAKETIME se combina naturalmente con HOUR, MINUTE y SECOND para descomponer y reconstruir horas. Por ejemplo, puedes redondear una hora al cuarto de hora más cercano:

SELECT
    hora_original,
    MAKETIME(
        HOUR(hora_original),
        FLOOR(MINUTE(hora_original) / 15) * 15,
        0
    ) AS hora_redondeada
FROM (
    SELECT '09:07:33' AS hora_original
    UNION SELECT '14:22:10'
    UNION SELECT '16:48:55'
    UNION SELECT '20:59:01'
) horas;
hora_originalhora_redondeada
09:07:3309:00:00
14:22:1014:15:00
16:48:5516:45:00
20:59:0120:45:00

La lógica toma la hora original, mantiene las horas, redondea los minutos al múltiplo de 15 inferior y descarta los segundos. Este tipo de redondeo temporal es común en sistemas de facturación por horas o en el registro de actividades por bloques de tiempo.

También puedes usar MAKETIME junto con SEC_TO_TIME para construir intervalos de forma más explícita, especialmente cuando necesitas que el código sea autoexplicativo para otros desarrolladores que lean tus consultas.

En el siguiente artículo veremos FROM_DAYS para convertir un número de días en una fecha.

Escrito por Eduardo Lázaro