Guía de hora actual en MySQL: NOW(), CURRENT_TIMESTAMP, DATE_FORMAT, configuración de zona horaria y mejores prácticas

目次

1. Introducción

¿Cuándo necesitas manejar la hora actual en MySQL?

En MySQL, obtener la hora actual es necesario en muchos escenarios diferentes. Por ejemplo, los siguientes casos de uso son comunes:

  • Insertar automáticamente una marca de tiempo al registrar datos
  • Por ejemplo, registrar la fecha y hora de creación al guardar datos de pedidos o de registros.
  • Filtrar datos en función de la hora actual
  • Por ejemplo, obtener solo los datos de los últimos 7 días o buscar registros con fechas futuras.
  • Formatear fechas y horas para su visualización
  • Formatear valores de fecha y hora para una mejor legibilidad al generar informes.
  • Gestionar la expiración de datos usando la hora actual
  • Por ejemplo, determinar si un cupón sigue siendo válido comparándolo con la hora actual.

Como puedes ver, obtener y manipular correctamente la hora actual en MySQL es una habilidad importante en la gestión de bases de datos.

Qué aprenderás en este artículo

Este artículo explica los siguientes temas en detalle:

  • Cómo obtener la hora actual en MySQL (NOW(), CURRENT_TIMESTAMP, etc.)
  • Cómo cambiar formatos de fecha y hora (usando DATE_FORMAT())
  • Cálculos de fecha y hora usando la hora actual (usando INTERVAL)
  • Cómo cambiar la zona horaria (SET SESSION time_zone)
  • Usar la hora actual como valor por defecto (CURRENT_TIMESTAMP)
  • Errores comunes y cómo solucionarlos (FAQ)

Desde lo básico hasta el uso avanzado del manejo de la “hora actual” en MySQL, esta guía ofrece ejemplos prácticos de SQL. Asegúrate de leer hasta el final.

2. Cómo obtener la hora actual en MySQL

Lista de funciones para obtener la hora actual en MySQL

MySQL proporciona varias funciones para obtener la hora actual. Comprende sus diferencias y utilízalas de forma adecuada.

FunctionReturnsExample
NOW()Current date and time (date + time)SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMPSame as NOW() (SQL standard)SELECT CURRENT_TIMESTAMP;
CURDATE()Current date onlySELECT CURDATE();2025-02-11
CURTIME()Current time onlySELECT CURTIME();16:00:00

Función NOW()

NOW() es la función más utilizada en MySQL para obtener la hora actual.
Devuelve tanto la fecha como la hora.

SELECT NOW();

Ejemplo de salida:

2025-02-11 16:00:00
  • NOW() devuelve la hora del sistema actual.
  • Como está influenciada por la zona horaria, la hora mostrada puede variar según tu entorno (explicado en detalle en la sección “Configuración de zona horaria”).

Cómo usar CURRENT_TIMESTAMP

CURRENT_TIMESTAMP se comporta casi igual que NOW(). Cumple con el estándar SQL y también puede usarse en otras bases de datos.

SELECT CURRENT_TIMESTAMP;

Ejemplo de salida:

2025-02-11 16:00:00

Obtener solo la fecha con CURDATE()

CURDATE() se usa cuando deseas obtener solo la fecha actual (año, mes, día).

SELECT CURDATE();

Ejemplo de salida:

2025-02-11

Obtener solo la hora con CURTIME()

Si deseas obtener solo la hora actual (hora, minuto, segundo), usa CURTIME().

SELECT CURTIME();

Ejemplo de salida:

16:00:00

¿Qué función deberías usar?

PurposeRecommended Function
Retrieve both date and timeNOW() or CURRENT_TIMESTAMP
Retrieve date onlyCURDATE()
Retrieve time onlyCURTIME()

3. Cómo formatear la hora actual en MySQL

Formateo personalizado con DATE_FORMAT()

Sintaxis básica de DATE_FORMAT()

En MySQL, puedes usar la función DATE_FORMAT() para cambiar libremente el formato de fechas y horas.

SELECT DATE_FORMAT(datetime_value, 'format_specifiers');

Ejemplo: Convertir NOW() al formato YYYY/MM/DD HH:MM

SELECT DATE_FORMAT(NOW(), '%Y/%m/%d %H:%i');

Salida:

2025/02/11 16:45

Lista de especificadores de formato comunes

SpecifierMeaningExample (2025-02-11 16:45:30)
%Y4-digit year2025
%m2-digit month (01-12)02
%d2-digit day (01-31)11
%HHour (00-23, 24-hour format)16
%iMinutes (00-59)45
%sSeconds (00-59)30

Extraer solo la parte de la hora con TIME()

Si deseas extraer solo la porción de hora del datetime devuelto por NOW(), usa la función TIME().

SELECT TIME(NOW());

Salida:

16:45:30

Extraer partes con YEAR(), MONTH() y DAY()

Para extraer solo partes específicas, usa las siguientes funciones.

FunctionReturnsSQLOutput Example (2025-02-11 16:45:30)
YEAR()YearSELECT YEAR(NOW());2025
MONTH()MonthSELECT MONTH(NOW());2
DAY()DaySELECT DAY(NOW());11

Ejemplos prácticos de formateo

El siguiente SQL es útil para probar varios formatos en la práctica.

SELECT 
    NOW() AS 'Original datetime',
    DATE_FORMAT(NOW(), '%Y/%m/%d') AS 'YYYY/MM/DD format',
    DATE_FORMAT(NOW(), '%H:%i:%s') AS 'HH:MM:SS',
    TIME(NOW()) AS 'Time only',
    YEAR(NOW()) AS 'Year',
    MONTH(NOW()) AS 'Month',
    DAY(NOW()) AS 'Day';

4. Cálculos de Fecha/Hora Usando la Hora Actual en MySQL

Añadir/Restar con INTERVAL

Sintaxis Básica

SELECT current_datetime + INTERVAL number unit;
SELECT current_datetime - INTERVAL number unit;

Añadir Tiempo Basado en NOW()

Por ejemplo, para obtener la fecha y hora “una semana después”:

SELECT NOW() + INTERVAL 7 DAY;

Ejemplo de salida:

2025-02-18 16:30:00
UnitMeaningExample
SECONDSecondsNOW() + INTERVAL 10 SECOND
MINUTEMinutesNOW() + INTERVAL 5 MINUTE
HOURHoursNOW() + INTERVAL 2 HOUR
DAYDaysNOW() + INTERVAL 10 DAY
MONTHMonthsNOW() + INTERVAL 3 MONTH

Calcular la Diferencia Entre Dos Fechas con DATEDIFF()

SELECT DATEDIFF(NOW(), '2025-01-01');

Ejemplo de salida:

30

Filtrar por un Rango de Fechas con BETWEEN

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

5. Configuraciones de Zona Horaria en MySQL

Verificar la Zona Horaria Actual

SHOW VARIABLES LIKE '%time_zone%';

Ejemplo de salida:

+------------------+----------------+
| Variable_name    | Value          |
+------------------+----------------+
| system_time_zone | UTC            |
| time_zone        | SYSTEM         |
+------------------+----------------+

Cambiar la Zona Horaria por Sesión

SET SESSION time_zone = 'Asia/Tokyo';

Cambiar la Zona Horaria Predeterminada del Servidor

Agregue lo siguiente al archivo de configuración (my.cnf):

[mysqld]
default_time_zone = 'Asia/Tokyo'

Obtener la Hora UTC con UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Convertir a Hora Local con CONVERT_TZ()

SELECT CONVERT_TZ(UTC_TIMESTAMP(), 'UTC', 'Asia/Tokyo');

6. Cómo Establecer la Hora Actual como Valor Predeterminado en MySQL

Establecer CURRENT_TIMESTAMP como Valor Predeterminado

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Actualizaciones Automáticas con ON UPDATE CURRENT_TIMESTAMP

CREATE TABLE logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Diferencia Entre DATETIME y TIMESTAMP

TypeAffected by Time ZoneCan Set CURRENT_TIMESTAMP as Default
TIMESTAMPYesYes
DATETIMENoNo

Por Qué No Puedes Usar NOW() como Valor Predeterminado y la Solución

ERROR 1067 (42000): Invalid default value for 'created_at'

Solución:

CREATE TRIGGER set_created_at
BEFORE INSERT ON logs
FOR EACH ROW
SET NEW.created_at = NOW();

7. Errores Comunes de MySQL y Soluciones (FAQ)

No Se Puede Usar NOW() como Valor Predeterminado

Ejemplo de Error

CREATE TABLE logs (
    created_at DATETIME DEFAULT NOW()
);
ERROR 1067 (42000): Invalid default value for 'created_at'

Solución

CREATE TABLE logs (
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

La Hora de CURRENT_TIMESTAMP es Incorrecta

SHOW VARIABLES LIKE 'time_zone';

Solución

SET SESSION time_zone = 'Asia/Tokyo';

El Resultado de NOW() Está Desfasado una Hora

SHOW VARIABLES LIKE 'system_time_zone';

Solución

SET GLOBAL time_zone = 'Asia/Tokyo';

El Filtrado por Rango con BETWEEN No Funciona como se Espera

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01' AND '2025-02-28';

Solución

SELECT * FROM orders
WHERE created_at BETWEEN '2025-02-01 00:00:00' AND '2025-02-28 23:59:59';

8. Mejores Prácticas para Manejar la Hora Actual en MySQL

Cuándo Usar NOW() vs CURRENT_TIMESTAMP

Use CaseRecommended
Retrieve the current time in a SELECT statementNOW()
Automatically set the current time during INSERTCURRENT_TIMESTAMP
Set as the default value of a TIMESTAMP columnCURRENT_TIMESTAMP

Cuándo Usar TIMESTAMP vs DATETIME

Data TypeAffected by Time ZoneStorage Size
TIMESTAMPYes4 bytes
DATETIMENo8 bytes

Almacenar en UTC y Convertir a Hora Local

SELECT CONVERT_TZ(event_time, 'UTC', 'Asia/Tokyo');

Usar >= y < en lugar de BETWEEN

SELECT * FROM orders
WHERE created_at >= '2025-02-01 00:00:00' 
AND created_at < '2025-03-01 00:00:00';

Estandarizar el uso de INTERVAL

SELECT NOW() + INTERVAL 1 DAY;

Limpiar adecuadamente los datos antiguos

DELETE FROM logs WHERE created_at < NOW() - INTERVAL 1 YEAR LIMIT 1000;