La función NOW() devuelve la fecha y hora actuales del servidor MySQL en formato YYYY-MM-DD HH:MM:SS. Es una de las funciones más utilizadas en cualquier aplicación que necesite registrar cuándo ocurren los eventos, desde la creación de un pedido hasta el último inicio de sesión de un usuario.

A diferencia de otras funciones temporales, NOW() captura tanto la fecha como la hora en un solo valor, lo que la convierte en la opción predeterminada para columnas de tipo DATETIME y TIMESTAMP.

Sintaxis

NOW([fsp])

El parámetro opcional fsp (fractional seconds precision) acepta valores de 0 a 6 y determina cuántos dígitos de precisión fraccional se incluyen en el resultado. Si se omite, el valor predeterminado es 0 (sin fracciones de segundo).

Comportamiento básico

La forma más directa de usar NOW() es invocándola en una consulta SELECT para conocer la fecha y hora del servidor.

SELECT NOW();
NOW()
2025-07-15 14:32:08

Cuando necesitas mayor precisión, puedes especificar los dígitos fraccionarios. Esto resulta útil en sistemas donde múltiples operaciones pueden ocurrir en el mismo segundo.

SELECT NOW(3) AS milisegundos, NOW(6) AS microsegundos;
milisegundosmicrosegundos
2025-07-15 14:32:08.4512025-07-15 14:32:08.451293

Un detalle importante es que NOW() se evalúa una sola vez al inicio de la sentencia y mantiene ese valor durante toda su ejecución. Esto significa que si una consulta tarda varios segundos, todas las referencias a NOW() dentro de esa misma sentencia devolverán exactamente el mismo valor.

SELECT NOW() AS inicio, SLEEP(3), NOW() AS fin;
inicioSLEEP(3)fin
2025-07-15 14:32:0802025-07-15 14:32:08

Ambas columnas muestran la misma hora a pesar del retraso de tres segundos, porque NOW() se fija al comenzar la sentencia.

Caso práctico: registrar timestamps en inserciones

El uso más frecuente de NOW() es asignar automáticamente la fecha y hora de creación al insertar registros. Imagina una tabla de pedidos donde necesitas registrar cuándo se realizó cada compra.

CREATE TABLE pedidos (
    id INT AUTO_INCREMENT PRIMARY KEY,
    cliente_id INT NOT NULL,
    total DECIMAL(10,2) NOT NULL,
    fecha_pedido DATETIME NOT NULL,
    fecha_envio DATETIME DEFAULT NULL
);
 
INSERT INTO pedidos (cliente_id, total, fecha_pedido)
VALUES (1042, 259.90, NOW());
 
SELECT * FROM pedidos WHERE id = LAST_INSERT_ID();
idcliente_idtotalfecha_pedidofecha_envio
11042259.902025-07-15 14:32:08NULL

También puedes usar NOW() con precisión fraccionaria si la columna está definida con DATETIME(3) o DATETIME(6), lo que garantiza que incluso pedidos procesados en ráfaga tengan timestamps distinguibles.

ALTER TABLE pedidos MODIFY fecha_pedido DATETIME(3) NOT NULL;
 
INSERT INTO pedidos (cliente_id, total, fecha_pedido)
VALUES (1043, 84.50, NOW(3));

Caso práctico: filtrar registros recientes

Otro escenario habitual es combinar NOW() con operaciones aritméticas para filtrar registros dentro de un rango temporal. MySQL permite restar intervalos directamente a NOW().

SELECT id, cliente_id, total, fecha_pedido
FROM pedidos
WHERE fecha_pedido >= NOW() - INTERVAL 7 DAY
ORDER BY fecha_pedido DESC;
idcliente_idtotalfecha_pedido
87104384.502025-07-15 14:32:08.451
861042259.902025-07-15 14:32:08.000
85998132.002025-07-14 09:15:22.000
84101047.902025-07-12 18:40:55.000

Esta técnica es más confiable que calcular la fecha límite en la aplicación, porque usa la hora del servidor de base de datos como referencia única, evitando discrepancias por diferencias de zona horaria entre el servidor de aplicación y el de base de datos.

También puedes filtrar por intervalos más cortos, como las últimas dos horas.

SELECT id, cliente_id, total
FROM pedidos
WHERE fecha_pedido >= NOW() - INTERVAL 2 HOUR;

Caso práctico: actualizar con marca de tiempo

Cuando un pedido cambia de estado, resulta natural registrar el momento exacto usando NOW() en una sentencia UPDATE.

UPDATE pedidos
SET fecha_envio = NOW()
WHERE id = 86 AND fecha_envio IS NULL;
 
SELECT id, fecha_pedido, fecha_envio
FROM pedidos
WHERE id = 86;
idfecha_pedidofecha_envio
862025-07-15 14:32:082025-07-15 16:45:33

La condición fecha_envio IS NULL actúa como salvaguarda para no sobrescribir una fecha de envío ya registrada.

Manejo de NULL

NOW() nunca devuelve NULL por sí misma. Siempre produce un valor válido de fecha y hora. Sin embargo, cuando la usas en expresiones que involucran columnas que pueden ser NULL, debes tener cuidado con las comparaciones.

SELECT id, cliente_id,
       TIMESTAMPDIFF(HOUR, fecha_pedido, COALESCE(fecha_envio, NOW())) AS horas_en_proceso
FROM pedidos;
idcliente_idhoras_en_proceso
8610422
8710430

Aquí, COALESCE reemplaza fecha_envio con NOW() cuando aún no se ha registrado un envío, permitiendo calcular cuánto tiempo lleva un pedido en proceso.

Combinación con otras funciones

NOW() se combina frecuentemente con funciones de extracción para obtener componentes específicos del momento actual.

SELECT NOW() AS ahora,
       DATE(NOW()) AS solo_fecha,
       TIME(NOW()) AS solo_hora,
       YEAR(NOW()) AS anio,
       MONTH(NOW()) AS mes,
       DAYNAME(NOW()) AS dia_semana;
ahorasolo_fechasolo_horaaniomesdia_semana
2025-07-15 14:32:082025-07-1514:32:0820257Tuesday

También resulta útil junto con DATEDIFF para calcular la antigüedad de un registro.

SELECT id, cliente_id, fecha_pedido,
       DATEDIFF(NOW(), fecha_pedido) AS dias_desde_pedido
FROM pedidos
ORDER BY dias_desde_pedido DESC;
idcliente_idfecha_pedidodias_desde_pedido
8410102025-07-12 18:40:553
859982025-07-14 09:15:221
8610422025-07-15 14:32:080
8710432025-07-15 14:32:080

Es importante señalar que NOW() y CURRENT_TIMESTAMP son sinónimos perfectos en MySQL. Puedes usar cualquiera de las dos formas y obtendrás el mismo resultado. La diferencia con SYSDATE() es más sutil pero relevante: mientras NOW() se fija al inicio de la sentencia, SYSDATE() se evalúa en el momento exacto de su ejecución, lo que puede producir valores distintos dentro de la misma consulta.

En el siguiente artículo veremos CURDATE para obtener solo la fecha actual.

Escrito por Eduardo Lázaro