UTC_TIME

La función UTC_TIME devuelve la hora actual en formato UTC (Tiempo Universal Coordinado), sin considerar la zona horaria configurada en la sesión o el servidor de MySQL. Mientras que CURTIME refleja la hora local según la zona horaria activa, UTC_TIME siempre devuelve la hora del meridiano de Greenwich. Esto resulta esencial para sistemas distribuidos donde los servidores están en diferentes regiones y necesitan una referencia horaria común.

Cuando una aplicación tiene usuarios en Tokio, Madrid y Nueva York, registrar la hora en UTC permite reconstruir la secuencia exacta de eventos sin ambigüedad. A la hora de mostrar la información al usuario final, la conversión a hora local se realiza en la capa de presentación, pero el dato almacenado siempre es UTC.

Sintaxis

UTC_TIME
UTC_TIME([fsp])

El parámetro opcional fsp (fractional seconds precision) permite especificar la precisión en fracciones de segundo, con un rango de 0 a 6. Sin argumento, la función devuelve la hora sin decimales. Devuelve un valor de tipo TIME en formato HH:MM:SS en contexto de cadena, o HHMMSS en contexto numérico.

Comportamiento básico

La comparación más reveladora es ejecutar UTC_TIME junto con CURTIME cuando la sesión tiene una zona horaria diferente a UTC.

SET time_zone = 'America/Bogota';
SELECT UTC_TIME() AS hora_utc, CURTIME() AS hora_local;
hora_utchora_local
19:45:3314:45:33

Bogotá está en UTC-5, por lo que la hora local siempre es cinco horas menos que UTC. Esta diferencia se mantiene constante porque Colombia no aplica horario de verano.

Para obtener fracciones de segundo, puedes usar UTC_TIME con precisión.

SELECT UTC_TIME(3) AS hora_utc_ms, UTC_TIME(6) AS hora_utc_us;
hora_utc_mshora_utc_us
19:45:33.12719:45:33.127482

La precisión de microsegundos es particularmente útil en sistemas de alta frecuencia donde múltiples eventos pueden ocurrir en el mismo segundo, como procesamiento de transacciones financieras o registros de telemetría.

Contexto numérico

Al igual que otras funciones de tiempo, UTC_TIME se convierte a un número cuando se usa en operaciones aritméticas.

SELECT UTC_TIME() + 0 AS hora_numerica;
hora_numerica
194533

Con precisión de fracciones de segundo, el formato numérico incluye los decimales.

SELECT UTC_TIME(3) + 0 AS hora_numerica_ms;
hora_numerica_ms
194533.127

Caso práctico: registrar hora de acceso en sistemas globales

Un sistema de autenticación que sirve a usuarios en múltiples países necesita registrar la hora exacta de cada inicio de sesión en UTC para poder correlacionar eventos de seguridad.

CREATE TABLE registro_accesos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    usuario_id INT NOT NULL,
    hora_acceso_utc TIME(3) DEFAULT (UTC_TIME(3)),
    fecha_acceso_utc DATE DEFAULT (UTC_DATE()),
    ip_origen VARCHAR(45),
    pais VARCHAR(50)
);
 
INSERT INTO registro_accesos (usuario_id, ip_origen, pais)
VALUES
    (301, '203.45.67.89', 'Japón'),
    (542, '85.123.45.67', 'España'),
    (178, '190.25.67.89', 'Colombia');
 
SELECT usuario_id, hora_acceso_utc, fecha_acceso_utc, pais
FROM registro_accesos;
usuario_idhora_acceso_utcfecha_acceso_utcpais
30119:45:33.1272026-02-14Japón
54219:45:33.2452026-02-14España
17819:45:33.3122026-02-14Colombia

Gracias a la precisión de milisegundos, podemos distinguir el orden exacto de cada acceso incluso cuando ocurren en el mismo segundo.

Caso práctico: ventanas de mantenimiento globales

Una empresa de infraestructura cloud programa ventanas de mantenimiento definidas en UTC para que todos los equipos técnicos, sin importar su ubicación, sepan exactamente cuándo ocurrirán.

SELECT
    servicio,
    ventana_inicio_utc,
    ventana_fin_utc,
    CASE
        WHEN UTC_TIME() BETWEEN ventana_inicio_utc AND ventana_fin_utc
            THEN 'EN MANTENIMIENTO'
        WHEN UTC_TIME() < ventana_inicio_utc
            THEN 'Programado'
        ELSE 'Completado'
    END AS estado
FROM ventanas_mantenimiento
WHERE fecha_programada = UTC_DATE();
servicioventana_inicio_utcventana_fin_utcestado
API Pagos02:00:0004:00:00Completado
Base de datos18:00:0020:00:00EN MANTENIMIENTO
CDN22:00:0023:30:00Programado

De esta forma, el equipo en Buenos Aires y el equipo en Seúl consultan el mismo estado en tiempo real, porque la comparación se hace exclusivamente contra la hora UTC.

Caso práctico: restricción de operaciones por horario UTC

Algunos sistemas financieros restringen ciertas operaciones a horarios específicos definidos en UTC, como la ventana de liquidación interbancaria.

SELECT
    t.id,
    t.monto,
    t.moneda,
    UTC_TIME() AS hora_actual_utc,
    CASE
        WHEN UTC_TIME() BETWEEN '08:00:00' AND '17:00:00'
            THEN 'Procesamiento inmediato'
        ELSE 'En cola para próxima ventana'
    END AS estado_procesamiento
FROM transferencias_internacionales t
WHERE t.estado = 'pendiente'
ORDER BY t.monto DESC;
idmontomonedahora_actual_utcestado_procesamiento
4521150000.00EUR19:45:33En cola para próxima ventana
452385000.00USD19:45:33En cola para próxima ventana
452742000.00GBP19:45:33En cola para próxima ventana

Manejo de NULL

La función UTC_TIME nunca devuelve NULL de forma directa, ya que siempre tiene acceso al reloj del sistema. No obstante, cuando la combinas con columnas que pueden contener valores nulos, el resultado de la expresión completa puede ser NULL.

SELECT
    nombre,
    hora_entrada,
    TIMEDIFF(UTC_TIME(), hora_entrada) AS tiempo_trabajado
FROM empleados
WHERE hora_entrada IS NOT NULL;
nombrehora_entradatiempo_trabajado
Ana Martínez08:00:0011:45:33
Pedro Sánchez09:30:0010:15:33
Laura Gómez07:45:0012:00:33

Si hora_entrada fuese NULL, la función TIMEDIFF devolvería NULL. El filtro WHERE evita que esto ocurra en los resultados.

Combinación con otras funciones

UTC_TIME se puede combinar con ADDTIME y SUBTIME para hacer cálculos de horas en UTC.

SELECT
    UTC_TIME() AS ahora_utc,
    ADDTIME(UTC_TIME(), '02:30:00') AS en_dos_horas_y_media,
    SUBTIME(UTC_TIME(), '05:00:00') AS hace_cinco_horas;
ahora_utcen_dos_horas_y_mediahace_cinco_horas
19:45:3322:15:3314:45:33

También puedes combinarla con TIME_FORMAT para presentar la hora en formatos personalizados.

SELECT
    TIME_FORMAT(UTC_TIME(), '%h:%i %p') AS hora_utc_12h,
    TIME_FORMAT(UTC_TIME(), '%H:%i') AS hora_utc_24h;
hora_utc_12hhora_utc_24h
07:45 PM19:45

La combinación de UTC_TIME con SEC_TO_TIME y TIME_TO_SEC permite realizar aritmética precisa de tiempos cuando necesitas trabajar con duraciones expresadas en segundos.

En el siguiente artículo veremos UTC_TIMESTAMP para obtener fecha y hora combinadas en UTC.

Escrito por Eduardo Lázaro