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_utc | hora_local |
|---|---|
| 19:45:33 | 14: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_ms | hora_utc_us |
|---|---|
| 19:45:33.127 | 19: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_id | hora_acceso_utc | fecha_acceso_utc | pais |
|---|---|---|---|
| 301 | 19:45:33.127 | 2026-02-14 | Japón |
| 542 | 19:45:33.245 | 2026-02-14 | España |
| 178 | 19:45:33.312 | 2026-02-14 | Colombia |
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();| servicio | ventana_inicio_utc | ventana_fin_utc | estado |
|---|---|---|---|
| API Pagos | 02:00:00 | 04:00:00 | Completado |
| Base de datos | 18:00:00 | 20:00:00 | EN MANTENIMIENTO |
| CDN | 22:00:00 | 23:30:00 | Programado |
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;| id | monto | moneda | hora_actual_utc | estado_procesamiento |
|---|---|---|---|---|
| 4521 | 150000.00 | EUR | 19:45:33 | En cola para próxima ventana |
| 4523 | 85000.00 | USD | 19:45:33 | En cola para próxima ventana |
| 4527 | 42000.00 | GBP | 19:45:33 | En 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;| nombre | hora_entrada | tiempo_trabajado |
|---|---|---|
| Ana Martínez | 08:00:00 | 11:45:33 |
| Pedro Sánchez | 09:30:00 | 10:15:33 |
| Laura Gómez | 07:45:00 | 12: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_utc | en_dos_horas_y_media | hace_cinco_horas |
|---|---|---|
| 19:45:33 | 22:15:33 | 14: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_12h | hora_utc_24h |
|---|---|
| 07:45 PM | 19: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
