DATE almacena una fecha sin componente de hora, en formato YYYY-MM-DD. Ocupa 3 bytes y soporta un rango desde 1000-01-01 hasta 9999-12-31. Es el tipo adecuado para fechas de nacimiento, fechas de contratación, vencimientos y cualquier dato donde la hora no es relevante.
Sintaxis
CREATE TABLE nombre_tabla ( columna DATE NOT NULL);
Ejemplo básico
CREATE TABLE eventos ( id INT AUTO_INCREMENT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, fecha_inicio DATE NOT NULL, fecha_fin DATE);INSERT INTO eventos (nombre, fecha_inicio, fecha_fin) VALUES('Conferencia SQL', '2026-03-15', '2026-03-17'),('Taller MySQL', '2026-04-01', '2026-04-01'),('Hackathon', '2026-05-10', '2026-05-12'),('Meetup Dev', '2026-06-20', NULL);SELECT * FROM eventos;
id
nombre
fecha_inicio
fecha_fin
1
Conferencia SQL
2026-03-15
2026-03-17
2
Taller MySQL
2026-04-01
2026-04-01
3
Hackathon
2026-05-10
2026-05-12
4
Meetup Dev
2026-06-20
DATE en tienda_mysql
La tabla empleados usa DATE para la fecha de contratación:
SELECT nombre, puesto, fecha_contratacionFROM empleadosORDER BY fecha_contratacion;
nombre
puesto
fecha_contratacion
Ricardo
Director General
2020-01-15
Sofía
Directora de Ventas
2020-03-01
Alberto
Director de Logística
2020-06-10
Natalia
Vendedora Senior
2021-02-20
Cristina
Responsable de Almacén
2021-05-12
Daniel
Vendedor
2021-09-05
Patricia
Vendedora
2022-01-10
Marcos
Operario de Almacén
2022-08-20
Inés
Operaria de Almacén
2023-01-08
Raúl
Vendedor Junior
2023-04-15
Obtener la fecha actual
SELECT CURDATE() AS hoy, CURRENT_DATE() AS hoy_alt;
hoy
hoy_alt
2026-02-14
2026-02-14
CURDATE() y CURRENT_DATE() son sinónimos y devuelven la fecha actual del servidor.
Extraer partes de una fecha
SELECT fecha_contratacion, YEAR(fecha_contratacion) AS anio, MONTH(fecha_contratacion) AS mes, DAY(fecha_contratacion) AS dia, DAYNAME(fecha_contratacion) AS dia_semana, MONTHNAME(fecha_contratacion) AS nombre_mesFROM empleadosWHERE id = 1;
fecha_contratacion
anio
mes
dia
dia_semana
nombre_mes
2020-01-15
2020
1
15
Wednesday
January
Para obtener nombres en español, configura el locale:
SET lc_time_names = 'es_ES';SELECT DAYNAME('2020-01-15') AS dia, MONTHNAME('2020-01-15') AS mes;
dia
mes
miércoles
enero
Aritmética con fechas
DATE_ADD y DATE_SUB
SELECT CURDATE() AS hoy, DATE_ADD(CURDATE(), INTERVAL 7 DAY) AS en_una_semana, DATE_ADD(CURDATE(), INTERVAL 3 MONTH) AS en_tres_meses, DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AS hace_un_anio;
hoy
en_una_semana
en_tres_meses
hace_un_anio
2026-02-14
2026-02-21
2026-05-14
2025-02-14
DATEDIFF
Calcula la diferencia en días entre dos fechas:
SELECT nombre, fecha_contratacion, DATEDIFF(CURDATE(), fecha_contratacion) AS dias_trabajadosFROM empleadosORDER BY dias_trabajados DESCLIMIT 5;
nombre
fecha_contratacion
dias_trabajados
Ricardo
2020-01-15
2222
Sofía
2020-03-01
2176
Alberto
2020-06-10
2075
Natalia
2021-02-20
1820
Cristina
2021-05-12
1739
TIMESTAMPDIFF
Para diferencias en unidades distintas de días:
SELECT nombre, fecha_contratacion, TIMESTAMPDIFF(YEAR, fecha_contratacion, CURDATE()) AS anios, TIMESTAMPDIFF(MONTH, fecha_contratacion, CURDATE()) AS mesesFROM empleadosORDER BY fecha_contratacionLIMIT 3;
nombre
fecha_contratacion
anios
meses
Ricardo
2020-01-15
6
72
Sofía
2020-03-01
5
71
Alberto
2020-06-10
5
68
Filtrar por fecha
-- Empleados contratados en 2021SELECT nombre, fecha_contratacion FROM empleadosWHERE YEAR(fecha_contratacion) = 2021;
nombre
fecha_contratacion
Natalia
2021-02-20
Cristina
2021-05-12
Daniel
2021-09-05
-- Empleados contratados en los últimos 3 añosSELECT nombre, fecha_contratacion FROM empleadosWHERE fecha_contratacion >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR);
nombre
fecha_contratacion
Inés
2023-01-08
Raúl
2023-04-15
-- Rango de fechasSELECT nombre, fecha_contratacion FROM empleadosWHERE fecha_contratacion BETWEEN '2021-01-01' AND '2021-12-31';
nombre
fecha_contratacion
Natalia
2021-02-20
Cristina
2021-05-12
Daniel
2021-09-05
Formatear fechas
DATE_FORMAT convierte una fecha a cualquier formato:
SELECT nombre, DATE_FORMAT(fecha_contratacion, '%d/%m/%Y') AS formato_europeo, DATE_FORMAT(fecha_contratacion, '%d de %M de %Y') AS formato_largoFROM empleadosLIMIT 3;
nombre
formato_europeo
formato_largo
Ricardo
15/01/2020
15 de January de 2020
Sofía
01/03/2020
01 de March de 2020
Alberto
10/06/2020
10 de June de 2020
Especificadores comunes:
Especificador
Descripción
Ejemplo
%Y
Año 4 dígitos
2026
%y
Año 2 dígitos
26
%m
Mes con cero
03
%c
Mes sin cero
3
%M
Nombre del mes
March
%d
Día con cero
05
%e
Día sin cero
5
%W
Nombre del día
Monday
Convertir cadenas a DATE
SELECT STR_TO_DATE('15/03/2026', '%d/%m/%Y') AS fecha;
fecha
2026-03-15
STR_TO_DATE es la inversa de DATE_FORMAT: convierte una cadena con un formato dado a un valor DATE.
LAST_DAY
Devuelve el último día del mes:
SELECT LAST_DAY('2026-02-14') AS ultimo_febrero, LAST_DAY('2026-03-01') AS ultimo_marzo;
ultimo_febrero
ultimo_marzo
2026-02-28
2026-03-31
Valores especiales
DATE permite el valor especial 0000-00-00 (fecha cero), aunque en modo estricto está deshabilitado por defecto. Evita usarlo; usa NULL para indicar la ausencia de una fecha.
Limpieza
DROP TABLE IF EXISTS eventos;
En el siguiente artículo veremos TIME, el tipo para almacenar horas, minutos y segundos sin fecha.