DATE

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;
idnombrefecha_iniciofecha_fin
1Conferencia SQL2026-03-152026-03-17
2Taller MySQL2026-04-012026-04-01
3Hackathon2026-05-102026-05-12
4Meetup Dev2026-06-20

DATE en tienda_mysql

La tabla empleados usa DATE para la fecha de contratación:

SELECT nombre, puesto, fecha_contratacion
FROM empleados
ORDER BY fecha_contratacion;
nombrepuestofecha_contratacion
RicardoDirector General2020-01-15
SofíaDirectora de Ventas2020-03-01
AlbertoDirector de Logística2020-06-10
NataliaVendedora Senior2021-02-20
CristinaResponsable de Almacén2021-05-12
DanielVendedor2021-09-05
PatriciaVendedora2022-01-10
MarcosOperario de Almacén2022-08-20
InésOperaria de Almacén2023-01-08
RaúlVendedor Junior2023-04-15

Obtener la fecha actual

SELECT CURDATE() AS hoy, CURRENT_DATE() AS hoy_alt;
hoyhoy_alt
2026-02-142026-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_mes
FROM empleados
WHERE id = 1;
fecha_contratacionaniomesdiadia_semananombre_mes
2020-01-152020115WednesdayJanuary

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;
diames
miércolesenero

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;
hoyen_una_semanaen_tres_meseshace_un_anio
2026-02-142026-02-212026-05-142025-02-14

DATEDIFF

Calcula la diferencia en días entre dos fechas:

SELECT
    nombre,
    fecha_contratacion,
    DATEDIFF(CURDATE(), fecha_contratacion) AS dias_trabajados
FROM empleados
ORDER BY dias_trabajados DESC
LIMIT 5;
nombrefecha_contrataciondias_trabajados
Ricardo2020-01-152222
Sofía2020-03-012176
Alberto2020-06-102075
Natalia2021-02-201820
Cristina2021-05-121739

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 meses
FROM empleados
ORDER BY fecha_contratacion
LIMIT 3;
nombrefecha_contratacionaniosmeses
Ricardo2020-01-15672
Sofía2020-03-01571
Alberto2020-06-10568

Filtrar por fecha

-- Empleados contratados en 2021
SELECT nombre, fecha_contratacion FROM empleados
WHERE YEAR(fecha_contratacion) = 2021;
nombrefecha_contratacion
Natalia2021-02-20
Cristina2021-05-12
Daniel2021-09-05
-- Empleados contratados en los últimos 3 años
SELECT nombre, fecha_contratacion FROM empleados
WHERE fecha_contratacion >= DATE_SUB(CURDATE(), INTERVAL 3 YEAR);
nombrefecha_contratacion
Inés2023-01-08
Raúl2023-04-15
-- Rango de fechas
SELECT nombre, fecha_contratacion FROM empleados
WHERE fecha_contratacion BETWEEN '2021-01-01' AND '2021-12-31';
nombrefecha_contratacion
Natalia2021-02-20
Cristina2021-05-12
Daniel2021-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_largo
FROM empleados
LIMIT 3;
nombreformato_europeoformato_largo
Ricardo15/01/202015 de January de 2020
Sofía01/03/202001 de March de 2020
Alberto10/06/202010 de June de 2020

Especificadores comunes:

EspecificadorDescripciónEjemplo
%YAño 4 dígitos2026
%yAño 2 dígitos26
%mMes con cero03
%cMes sin cero3
%MNombre del mesMarch
%dDía con cero05
%eDía sin cero5
%WNombre del díaMonday

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_febreroultimo_marzo
2026-02-282026-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.

Escrito por Eduardo Lázaro