La función CURTIME() devuelve la hora actual del servidor MySQL en formato HH:MM:SS, sin incluir la fecha. Es la contraparte temporal de CURDATE(): mientras aquella proporciona solo la fecha, CURTIME() proporciona solo la hora. Resulta útil en sistemas que necesitan evaluar el momento del día, como aplicaciones de control de horarios, turnos laborales o restricciones de acceso por franja horaria.

En la práctica, CURTIME() equivale a ejecutar TIME(NOW()), pero con una sintaxis más concisa y una intención más clara cuando la fecha del día no es relevante para la operación.

Sintaxis

CURTIME([fsp])

El parámetro opcional fsp (fractional seconds precision) acepta valores de 0 a 6, determinando la cantidad de dígitos de precisión fraccional. Si se omite, devuelve la hora sin fracciones de segundo. Su sinónimo estándar SQL es CURRENT_TIME, que puede usarse con o sin paréntesis.

Comportamiento básico

La llamada más directa a CURTIME() devuelve la hora con precisión de segundos.

SELECT CURTIME() AS hora_actual;
hora_actual
14:32:08

Para obtener mayor precisión, especifica los dígitos fraccionarios. Esto es importante en sistemas de alta frecuencia donde múltiples eventos pueden registrarse en el mismo segundo.

SELECT CURTIME() AS segundos,
       CURTIME(3) AS milisegundos,
       CURTIME(6) AS microsegundos;
segundosmilisegundosmicrosegundos
14:32:0814:32:08.45114:32:08.451293

Las tres formas sinónimas producen el mismo resultado.

SELECT CURTIME() AS forma_1,
       CURRENT_TIME AS forma_2,
       CURRENT_TIME() AS forma_3;
forma_1forma_2forma_3
14:32:0814:32:0814:32:08

Cuando CURTIME() se utiliza en un contexto numérico, MySQL lo convierte a un valor con formato HHMMSS o HHMMSS.ffffff si se especificó precisión fraccionaria.

SELECT CURTIME() + 0 AS hora_numerica, CURTIME(3) + 0 AS hora_numerica_frac;
hora_numericahora_numerica_frac
143208143208.451

Caso práctico: control de horarios laborales

Imagina un sistema de recursos humanos donde necesitas verificar si un empleado está registrando su entrada dentro del horario permitido. Puedes comparar CURTIME() con los límites de la jornada.

CREATE TABLE registros_asistencia (
    id INT AUTO_INCREMENT PRIMARY KEY,
    empleado_id INT NOT NULL,
    hora_entrada TIME NOT NULL,
    hora_salida TIME DEFAULT NULL,
    fecha DATE NOT NULL
);
 
INSERT INTO registros_asistencia (empleado_id, hora_entrada, fecha)
VALUES (205, CURTIME(), CURDATE());
 
SELECT e.nombre, ra.hora_entrada, ra.fecha,
       CASE
           WHEN ra.hora_entrada <= '09:00:00' THEN 'Puntual'
           WHEN ra.hora_entrada <= '09:15:00' THEN 'Tolerancia'
           ELSE 'Retardo'
       END AS estatus
FROM registros_asistencia ra
JOIN empleados e ON e.id = ra.empleado_id
WHERE ra.fecha = CURDATE();
nombrehora_entradafechaestatus
Carlos Ruiz08:47:222025-07-15Puntual
Ana Martínez09:03:152025-07-15Tolerancia
Pedro Sánchez09:22:402025-07-15Retardo

La comparación directa entre valores de tipo TIME funciona de forma intuitiva en MySQL, respetando el orden cronológico.

Caso práctico: restricciones por franja horaria

Algunos negocios aplican descuentos o restricciones según la hora del día. CURTIME() permite implementar esta lógica directamente en las consultas.

SELECT p.nombre, p.precio,
       CASE
           WHEN CURTIME() BETWEEN '11:00:00' AND '14:59:59' THEN 'Menú del día'
           WHEN CURTIME() BETWEEN '18:00:00' AND '21:59:59' THEN 'Cena'
           ELSE 'Fuera de horario'
       END AS servicio,
       CASE
           WHEN CURTIME() BETWEEN '15:00:00' AND '17:59:59' THEN ROUND(p.precio * 0.85, 2)
           ELSE p.precio
       END AS precio_final
FROM productos p
WHERE p.categoria = 'restaurante';
nombreprecioservicioprecio_final
Ensalada César12.50Menú del día12.50
Pasta Carbonara15.90Menú del día15.90
Salmón a la plancha22.00Menú del día22.00

En este ejemplo, los precios se reducen un 15% durante la franja de las 15:00 a las 17:59, una táctica habitual en restaurantes para atraer clientes en horas de menor afluencia.

Caso práctico: calcular tiempo transcurrido

Cuando necesitas medir cuánto tiempo ha pasado desde un evento ocurrido hoy, puedes restar una hora almacenada de CURTIME() usando TIMEDIFF.

SELECT e.nombre, ra.hora_entrada,
       TIMEDIFF(CURTIME(), ra.hora_entrada) AS tiempo_trabajado
FROM registros_asistencia ra
JOIN empleados e ON e.id = ra.empleado_id
WHERE ra.fecha = CURDATE()
  AND ra.hora_salida IS NULL;
nombrehora_entradatiempo_trabajado
Carlos Ruiz08:47:2205:44:46
Ana Martínez09:03:1505:28:53
Pedro Sánchez09:22:4005:09:28

TIMEDIFF devuelve la diferencia como un valor TIME, lo que permite operaciones adicionales como convertirla a minutos u horas decimales.

SELECT e.nombre,
       TIME_TO_SEC(TIMEDIFF(CURTIME(), ra.hora_entrada)) / 3600 AS horas_decimal
FROM registros_asistencia ra
JOIN empleados e ON e.id = ra.empleado_id
WHERE ra.fecha = CURDATE();
nombrehoras_decimal
Carlos Ruiz5.7461
Ana Martínez5.4814
Pedro Sánchez5.1578

Manejo de NULL

CURTIME() nunca devuelve NULL. Siempre produce la hora actual del servidor. Al combinarla con columnas que puedan contener valores nulos, el resultado de la expresión será NULL si alguno de los operandos lo es.

SELECT e.nombre, ra.hora_entrada, ra.hora_salida,
       TIMEDIFF(COALESCE(ra.hora_salida, CURTIME()), ra.hora_entrada) AS horas_en_oficina
FROM registros_asistencia ra
JOIN empleados e ON e.id = ra.empleado_id
WHERE ra.fecha = CURDATE();

Aquí, COALESCE sustituye hora_salida por la hora actual cuando el empleado aún no ha marcado su salida, permitiendo calcular el tiempo parcial transcurrido.

Combinación con otras funciones

CURTIME() se complementa bien con funciones de extracción para obtener componentes individuales de la hora actual.

SELECT CURTIME() AS hora_completa,
       HOUR(CURTIME()) AS hora,
       MINUTE(CURTIME()) AS minutos,
       SECOND(CURTIME()) AS segundos,
       TIME_FORMAT(CURTIME(), '%h:%i %p') AS formato_12h;
hora_completahoraminutossegundosformato_12h
14:32:081432802:32 PM

También puedes combinar CURTIME() con CURDATE() para reconstruir un DATETIME completo, aunque en ese caso sería más directo usar NOW().

SELECT CONCAT(CURDATE(), ' ', CURTIME()) AS datetime_manual,
       NOW() AS datetime_directo;
datetime_manualdatetime_directo
2025-07-15 14:32:082025-07-15 14:32:08

La función ADDTIME permite sumar o restar un intervalo a la hora actual, lo que resulta práctico para calcular horas límite.

SELECT CURTIME() AS ahora,
       ADDTIME(CURTIME(), '02:00:00') AS en_dos_horas,
       SUBTIME(CURTIME(), '01:30:00') AS hace_hora_y_media;
ahoraen_dos_horashace_hora_y_media
14:32:0816:32:0813:02:08

En el siguiente artículo veremos SYSDATE y sus diferencias con NOW.

Escrito por Eduardo Lázaro