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;| ahora | fecha_actual | hora_actual | timestamp_actual |
|---|---|---|---|
| 2026-02-14 15:30:45 | 2026-02-14 | 15:30:45 | 2026-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;| anio | mes | dia | nombre_dia | nombre_mes | dia_semana | dia_del_anio | semana_del_anio |
|---|---|---|---|---|---|---|---|
| 2026 | 2 | 14 | Saturday | February | 7 | 45 | 6 |
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_europeo | formato_largo | hora_formateada | dia_completo |
|---|---|---|---|
| 14/02/2026 | 14 de February de 2026 | 15:30:45 | Saturday, 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:45 | 0 | 2026-02-14 15:30:45 | 2026-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_precision | milisegundos | microsegundos |
|---|---|---|
| 2026-02-14 15:30:45 | 2026-02-14 15:30:45.123 | 2026-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_unix | desde_unix |
|---|---|
| 1739542245 | 2026-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
