Obtener el día actual

MySQL ofrece varias funciones para obtener la fecha y hora actuales, cada una con un formato y nivel de precisión diferente. Conocerlas es esencial para filtrar registros por fecha, registrar timestamps, calcular diferencias de tiempo y construir informes basados en el día, mes o año actual.

Funciones de fecha y hora actual

Las funciones principales para obtener el momento actual son:

SELECT
    NOW() AS ahora,
    CURDATE() AS fecha_actual,
    CURTIME() AS hora_actual,
    CURRENT_TIMESTAMP() AS timestamp_actual;
ahorafecha_actualhora_actualtimestamp_actual
2026-02-14 15:30:452026-02-1415:30:452026-02-14 15:30:45

NOW() y CURRENT_TIMESTAMP() devuelven fecha y hora combinadas. CURDATE() devuelve solo la fecha sin hora. CURTIME() devuelve solo la hora sin fecha.

Sinónimos de las funciones

MySQL tiene sinónimos para compatibilidad con el estándar SQL:

SELECT
    CURRENT_DATE AS fecha,         -- Equivale a CURDATE()
    CURRENT_TIME AS hora,          -- Equivale a CURTIME()
    CURRENT_TIMESTAMP AS timestamp, -- Equivale a NOW()
    LOCALTIME AS local_time,       -- Equivale a NOW()
    LOCALTIMESTAMP AS local_ts;    -- Equivale a NOW()

Todas producen los mismos resultados. NOW() y CURDATE() son las más utilizadas por su brevedad.

Extraer componentes de la fecha

Para obtener partes específicas de la fecha actual:

SELECT
    YEAR(CURDATE()) AS anio,
    MONTH(CURDATE()) AS mes,
    DAY(CURDATE()) AS dia,
    DAYNAME(CURDATE()) AS nombre_dia,
    MONTHNAME(CURDATE()) AS nombre_mes,
    DAYOFWEEK(CURDATE()) AS dia_semana,
    DAYOFYEAR(CURDATE()) AS dia_del_anio,
    WEEK(CURDATE()) AS semana_del_anio;
aniomesdianombre_dianombre_mesdia_semanadia_del_aniosemana_del_anio
2026214SaturdayFebruary7456

DAYOFWEEK() devuelve 1 para domingo, 2 para lunes, hasta 7 para sábado (estándar ODBC). Si prefieres que lunes sea 1, usa WEEKDAY(), que devuelve 0 para lunes y 6 para domingo.

Formatear la fecha actual

La función DATE_FORMAT() permite formatear la fecha en cualquier patrón:

SELECT
    DATE_FORMAT(NOW(), '%d/%m/%Y') AS formato_europeo,
    DATE_FORMAT(NOW(), '%d de %M de %Y') AS formato_largo,
    DATE_FORMAT(NOW(), '%H:%i:%s') AS hora_formateada,
    DATE_FORMAT(NOW(), '%W, %d de %M') AS dia_completo;
formato_europeoformato_largohora_formateadadia_completo
14/02/202614 de February de 202615:30:45Saturday, 14 de February

Los especificadores más comunes son: %Y (año 4 dígitos), %m (mes con cero), %d (día con cero), %H (hora 24h), %i (minutos), %s (segundos), %W (nombre del día), %M (nombre del mes).

Consultas prácticas con la fecha actual

Pedidos de hoy

SELECT id, cliente_id, total, fecha_pedido
FROM pedidos
WHERE DATE(fecha_pedido) = CURDATE();

Pedidos de esta semana

SELECT id, total, fecha_pedido
FROM pedidos
WHERE YEARWEEK(fecha_pedido, 1) = YEARWEEK(CURDATE(), 1);

Pedidos del mes actual

SELECT id, total, fecha_pedido
FROM pedidos
WHERE YEAR(fecha_pedido) = YEAR(CURDATE())
AND MONTH(fecha_pedido) = MONTH(CURDATE());

Una alternativa más eficiente que puede usar índices:

SELECT id, total, fecha_pedido
FROM pedidos
WHERE fecha_pedido >= DATE_FORMAT(CURDATE(), '%Y-%m-01')
AND fecha_pedido < DATE_FORMAT(CURDATE() + INTERVAL 1 MONTH, '%Y-%m-01');

Pedidos de los últimos 7 días

SELECT id, total, fecha_pedido
FROM pedidos
WHERE fecha_pedido >= CURDATE() - INTERVAL 7 DAY;

Clientes que cumplen años hoy

SELECT nombre, apellidos, fecha_nacimiento
FROM clientes
WHERE MONTH(fecha_nacimiento) = MONTH(CURDATE())
AND DAY(fecha_nacimiento) = DAY(CURDATE());

NOW() vs SYSDATE()

Hay una diferencia sutil entre NOW() y SYSDATE() que puede ser importante:

SELECT NOW(), SLEEP(2), NOW(), SYSDATE();
NOW()SLEEP(2)NOW()SYSDATE()
2026-02-14 15:30:4502026-02-14 15:30:452026-02-14 15:30:47

NOW() devuelve el momento en que la sentencia comenzó a ejecutarse y mantiene ese valor constante durante toda la sentencia. SYSDATE() devuelve el momento exacto en que se evalúa, que puede ser diferente si la sentencia tarda en ejecutarse.

Para la mayoría de los casos, NOW() es la opción correcta porque garantiza consistencia dentro de la misma sentencia.

Precisión de microsegundos

NOW() puede devolver fracciones de segundo si se especifica la precisión:

SELECT
    NOW() AS sin_precision,
    NOW(3) AS milisegundos,
    NOW(6) AS microsegundos;
sin_precisionmilisegundosmicrosegundos
2026-02-14 15:30:452026-02-14 15:30:45.1232026-02-14 15:30:45.123456

Timestamp Unix

Para obtener la fecha actual como timestamp Unix (segundos desde 1970-01-01):

SELECT
    UNIX_TIMESTAMP() AS timestamp_unix,
    FROM_UNIXTIME(UNIX_TIMESTAMP()) AS desde_unix;
timestamp_unixdesde_unix
17395422452026-02-14 15:30:45

Los timestamps Unix son útiles para cálculos aritméticos de tiempo y para intercambiar datos con sistemas que usan este formato.

Zona horaria

MySQL devuelve la fecha y hora según la zona horaria configurada en la sesión:

-- Ver zona horaria actual
SELECT @@session.time_zone;
 
-- Cambiar zona horaria de la sesión
SET time_zone = '+01:00';  -- UTC+1 (España peninsular en invierno)
SET time_zone = 'Europe/Madrid';  -- Nombre de zona (requiere tablas de timezone cargadas)

Si tu aplicación sirve usuarios en diferentes zonas horarias, almacena siempre los timestamps en UTC y conviértelos en la capa de presentación:

-- Almacenar en UTC
INSERT INTO eventos (nombre, fecha) VALUES ('Reunión', UTC_TIMESTAMP());
 
-- Consultar convirtiendo a zona local
SELECT nombre, CONVERT_TZ(fecha, '+00:00', '+01:00') AS fecha_local
FROM eventos;

Obtener la fecha y hora actual es una de las operaciones más básicas en MySQL, pero las múltiples funciones, formatos y consideraciones de zona horaria hacen que valga la pena conocer todas las opciones disponibles.

Escrito por Eduardo Lázaro