Guía de Hora Actual en MySQL (NOW(), TIMESTAMP, Zonas Horarias)

目次

1. Introducción

¿Cuáles son los casos de uso para manejar la hora actual en MySQL?

En MySQL, obtener la hora actual es necesario en varias situaciones. Por ejemplo, se pueden considerar los siguientes casos de uso.

  • Entrada automática de marca de tiempo al registrar datos
  • Por ejemplo, al guardar datos de órdenes o registros, registrar la fecha y hora de creación de los datos.
  • Filtrado de datos basado en la hora actual
  • Por ejemplo, recuperar solo datos de los últimos 7 días o buscar datos con fechas futuras.
  • Manipular y mostrar fechas y horas
  • Al crear informes, formatear la fecha y hora para una mejor legibilidad.
  • Gestionar la expiración de datos usando la hora actual
  • Por ejemplo, determinar la expiración de un cupón comparándola con la hora actual.

Así, obtener y manipular correctamente la hora actual en MySQL es una habilidad esencial para las operaciones de bases de datos.

Lo que aprenderás en este artículo

En este artículo, explicaremos los siguientes temas en detalle.

  • Cómo recuperar la hora actual en MySQL (NOW(), CURRENT_TIMESTAMP, etc.)
  • Cambiar formatos de fecha y hora (cómo usar DATE_FORMAT())
  • Cálculos de fechas y horas usando la hora actual (manipulación de fechas con INTERVAL)
  • Cómo cambiar la zona horaria (SET SESSION time_zone)
  • Usar la hora actual como valor por defecto (aprovechando CURRENT_TIMESTAMP)
  • Causas comunes de errores y soluciones (FAQ)

Cubriremos todo, desde lo básico hasta el uso avanzado de manejar la «hora actual» con MySQL, incluyendo ejemplos prácticos de SQL, así que por favor lee hasta el final.

2. Cómo obtener la hora actual en MySQL

Lista de funciones para obtener la hora actual en MySQL

MySQL ofrece varias funciones para obtener la hora actual. Comprende sus diferencias y úsalas de manera adecuada.

Función

Valor devuelto

Ejemplo

NOW()

Fecha y hora actuales (fecha + hora)

SELECT NOW();2025-02-11 16:00:00
CURRENT_TIMESTAMP

Igual a NOW() (estándar SQL)

SELECT CURRENT_TIMESTAMP;
CURDATE()

Solo la fecha actual

SELECT CURDATE();2025-02-11
CURTIME()

Solo hora actual

SELECT CURTIME();16:00:00

Usando la función NOW()

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

SELECT NOW();

Salida de ejemplo:

2025-02-11 16:00:00
  • NOW() devuelve la hora del sistema actual.
  • Debido a que está afectada por la zona horaria, la hora mostrada puede diferir de las expectativas …

Cómo usar CURRENT_TIMESTAMP

CURRENT_TIMESTAMP funciona casi igual que NOW(). Se ajusta al estándar SQL y se puede usar de manera similar en otras bases de datos.

SELECT CURRENT_TIMESTAMP;

Salida de ejemplo:

2025-02-11 16:00:00

Obtener solo la fecha con CURDATE()

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

SELECT CURDATE();

Salida de ejemplo:

2025-02-11

Obtener solo la hora con CURTIME()

Usa CURTIME() cuando quieres obtener solo la hora actual (horas, minutos, segundos).

SELECT CURTIME();

Salida de ejemplo:

16:00:00

¿Cuál función debes usar?

Propósito

Función recomendada

Desea recuperar la fecha y la hora

NOW()CURRENT_TIMESTAMP

¿Quieres recuperar solo la fecha?

CURDATE()

¿Quieres recuperar solo la hora?

CURTIME()

3. Cómo formatear la hora actual en MySQL

Formato 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_to_format, 'format_specifier');

Ejemplo: NOW() a 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

Especificador

Significado

Ejemplo (2025-02-11 16:45:30)

%Y

año de 4 dígitos

2025
%m

Mes de dos dígitos (01-12)

02
%d

día de 2 dígitos (01-31)

11
%H

Hora en formato de 24 horas (00-23)

16
%i

Minutes (00-59)

45
%s

Segundos (00-59)

30

Obtener solo la parte de hora con TIME()

Si deseas extraer solo la parte de hora del datetime obtenido con NOW(), usa la función TIME().

SELECT TIME(NOW());

Salida:

16:45:30

Extracción parcial con YEAR(), MONTH(), DAY()

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

Función

Valor devuelto

SQL

Ejemplo de salida (2025-02-11 16:45:30)

YEAR()

Año

SELECT YEAR(NOW());2025
MONTH()

Mes

SELECT MONTH(NOW());2
DAY()

Día

SELECT DAY(NOW());11

Ejemplos prácticos de cambios de formato

El siguiente SQL es útil para probar varios formatos.

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

4. Cálculos de fecha y hora usando el tiempo actual en MySQL

Usando INTERVAL para adición y sustracción

Sintaxis básica

SELECT current_time + INTERVAL numeric_value unit;
SELECT current_time - INTERVAL numeric_value unit;

Adición basada 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

Unidad

Significado

Ejemplo

SECOND

segundos

NOW() + INTERVAL 10 SECOND

MINUTE

minutes

NOW() + INTERVAL 5 MINUTE

HORA>

horas

NOW() + INTERVAL 2 HOUR

DÍA

días

NOW() + INTERVAL 10 DAY

MES

meses

NOW() + INTERVAL 3 MONTH

Usando DATEDIFF() para calcular la diferencia entre dos fechas

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

Ejemplo de salida:

30

Usando BETWEEN para filtrar un rango de fechas

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

5. Configuración de la 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

Añada lo siguiente al archivo de configuración (my.cnf):

[mysqld]
default_time_zone = 'Asia/Tokyo'

Obtener hora UTC usando UTC_TIMESTAMP

SELECT UTC_TIMESTAMP();

Convertir a hora local usando CONVERT_TZ()

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

6. Cómo establecer la hora actual como valor predeterminado en MySQL

SETEAR CURRENT_TIMESTAMP como valor predeterminado

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

Actualización automática 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 el tipo DATETIME y el tipo TIMESTAMP

Tipo

Timezone impact

CURRENT_TIMESTAMP
TIMESTAMPAfectadoPossible
DATETIMENo afectadoNot possible

Por qué NOW() no puede usarse 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 sus soluciones (FAQ)

NOW() no puede usarse 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 está desfasada

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';

La especificación de rango BETWEEN no funciona correctamente

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

Caso de uso

Recomendado

Obtener la hora actual en una declaración SELECT

NOW()

Establecer automáticamente la hora actual en INSERT

CURRENT_TIMESTAMP

Establecer como valor predeterminado para columnas TIMESTAMP

CURRENT_TIMESTAMP

Cuándo usar TIMESTAMP vs DATETIME

Tipo de datos

Efecto de zona horaria

Tamaño de almacenamiento

TIMESTAMPAfectado4 bytes
DATETIMEInalterado8 bytes

Diseño: 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 datos correctamente

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