MySQL DATETIME: Guía Completa para Manejar Fechas y Horas en la Base de Datos

1. ¿Qué es DATETIME en MySQL?

El tipo de dato DATETIME en MySQL se utiliza para manejar fechas y horas de manera conjunta. La gestión de fechas y tiempos en bases de datos es esencial para aplicaciones como registros de logs o sistemas de reservas. El tipo DATETIME almacena fecha y hora en un solo campo, y puede abarcar un rango amplio de valores. Su rango va desde '1000-01-01 00:00:00' hasta '9999-12-31 23:59:59', con soporte para fracciones de segundos.

2. Descripción general de los tipos de datos de fecha y hora en MySQL

2.1 Tipos de datos para manejar fecha y hora

MySQL ofrece varios tipos de datos para trabajar con fechas y horas:
  • DATE: Maneja solo la fecha (año, mes y día). Rango: '1000-01-01' a '9999-12-31'.
  • TIME: Maneja solo la hora. Rango: '-838:59:59' a '838:59:59'.
  • DATETIME: Maneja fecha y hora combinadas. Rango: '1000-01-01 00:00:00' a '9999-12-31 23:59:59'.
  • TIMESTAMP: Almacena la marca de tiempo UNIX. Rango: '1970-01-01 00:00:01' a '2038-01-19 03:14:07'.

2.2 Diferencias entre DATETIME y TIMESTAMP

Aunque DATETIME y TIMESTAMP son similares, presentan diferencias clave:
  • Zona horaria: DATETIME guarda un valor fijo independiente de la zona horaria. En cambio, TIMESTAMP se convierte a UTC al almacenarse y se ajusta a la zona horaria del servidor al recuperarse. Por ello, DATETIME es ideal para fechas fijas como la de un evento, mientras que TIMESTAMP es más adecuado para registros dependientes de la zona horaria, como logs.
  • Formato de almacenamiento: DATETIME se almacena tal cual, mientras que TIMESTAMP se guarda como marca de tiempo UNIX, lo cual implica que su representación puede verse afectada por la configuración de zona horaria del servidor.

3. Uso de DATETIME en MySQL

3.1 Creación de una columna DATETIME

Para crear una columna con tipo DATETIME, se utiliza la siguiente sintaxis SQL:
CREATE TABLE sample_table (
    event_time DATETIME
);
En este ejemplo, se crea la columna event_time en la tabla sample_table.

3.2 Inserción de valores DATETIME

Los valores de DATETIME pueden insertarse en distintos formatos. El formato básico es 'YYYY-MM-DD HH:MM:SS'. Ejemplo:
INSERT INTO sample_table (event_time) VALUES ('2024-09-16 14:30:00');
También se permiten otros formatos:
  • 'YY-MM-DD HH:MM:SS': con el año en dos dígitos.
  • 'YYYYMMDDHHMMSS': sin caracteres separadores.
Ejemplos:
INSERT INTO sample_table (event_time) VALUES ('24-09-16 14:30:00');
INSERT INTO sample_table (event_time) VALUES (20240916143000);
Cuando el año se indica con dos dígitos, '70-99' se interpreta como 1970-1999 y '00-69' como 2000-2069.

3.3 Recuperación de valores DATETIME

Al consultarse, MySQL devuelve DATETIME en el formato 'YYYY-MM-DD HH:MM:SS'. Ejemplo:
SELECT event_time FROM sample_table;

4. Manejo de fracciones de segundo

4.1 Precisión de DATETIME

MySQL permite incluir fracciones de segundo en DATETIME mediante el parámetro fsp, que acepta valores de 0 a 6. Ejemplo con 3 decimales:
CREATE TABLE precise_times (
    event_time DATETIME(3)
);

4.2 Inserción con fracciones de segundo

Ejemplo de inserción con milisegundos:
INSERT INTO precise_times (event_time) VALUES ('2024-09-16 14:30:00.123');

5. Mejores prácticas con DATETIME

5.1 Cuándo usar DATETIME vs TIMESTAMP

  • Usar DATETIME: para fechas fijas independientes de la zona horaria (ej. inicio de un evento, fecha de reserva).
  • Usar TIMESTAMP: para fechas ligadas a la zona horaria del servidor (ej. creación o actualización de registros).

5.2 Gestión de zonas horarias

Como DATETIME no tiene en cuenta zonas horarias, la aplicación debe gestionarlas. TIMESTAMP sí las considera automáticamente, lo que lo hace más adecuado para entornos internacionales.

6. Errores comunes y cómo evitarlos

6.1 Fechas nulas y valores inválidos

Si se intenta insertar un valor DATETIME inválido, MySQL lo guarda como '0000-00-00 00:00:00'. Se recomienda implementar validaciones para impedirlo.

6.2 Uso incorrecto de la precisión

Configurar mal la precisión de fracciones de segundo (fsp) puede causar resultados no deseados. Solo especifica precisión cuando sea necesaria.

7. Conclusión

Hemos revisado el tipo DATETIME en MySQL: su definición, diferencias con TIMESTAMP, uso de zonas horarias, fracciones de segundo y errores comunes. Con estas prácticas, podrás manejar fechas y horas en bases de datos de forma eficiente y confiable.

8. Preguntas frecuentes (FAQ)

Q1: ¿Cuál es la principal diferencia entre DATETIME y TIMESTAMP?

DATETIME guarda valores fijos sin depender de la zona horaria. TIMESTAMP se almacena en UTC y se ajusta a la zona horaria del servidor al consultarse.

Q2: ¿Cómo guardar fracciones de segundo en DATETIME?

Define la columna con un valor de precisión (fsp), por ejemplo DATETIME(3), para permitir hasta milisegundos.

Q3: ¿Cuándo usar DATETIME y cuándo TIMESTAMP?

Usa DATETIME para fechas fijas como reservas o eventos. Usa TIMESTAMP para registros sujetos a la zona horaria del servidor, como creación o actualización de datos.