La función DATE() extrae la parte de fecha de un valor DATETIME, TIMESTAMP o cadena con formato de fecha y hora, descartando completamente el componente de hora. El resultado es un valor de tipo DATE con formato YYYY-MM-DD.

Esta función es esencial cuando trabajas con columnas de tipo DATETIME pero necesitas realizar operaciones donde la hora del día no es relevante, como agrupar ventas por día, comparar fechas sin importar la hora exacta o vincular registros que ocurrieron en la misma fecha independientemente del momento del día.

Sintaxis

DATE(expresion)

El argumento expresion puede ser un valor de tipo DATE, DATETIME, TIMESTAMP o una cadena que MySQL pueda interpretar como fecha. Si el valor ya es de tipo DATE, la función lo devuelve sin modificaciones.

Comportamiento básico

La operación fundamental de DATE() es separar la fecha del componente temporal.

SELECT DATE('2025-07-15 14:32:08') AS solo_fecha;
solo_fecha
2025-07-15

Cuando se aplica a una columna de tipo DATETIME, elimina las horas, minutos y segundos.

SELECT fecha_pedido,
       DATE(fecha_pedido) AS fecha_sin_hora
FROM pedidos
LIMIT 4;
fecha_pedidofecha_sin_hora
2025-07-12 18:40:552025-07-12
2025-07-14 09:15:222025-07-14
2025-07-15 14:32:082025-07-15
2025-07-15 14:32:082025-07-15

Si el valor de entrada ya es de tipo DATE, la función simplemente lo retorna tal cual.

SELECT DATE('2025-07-15') AS ya_es_fecha;
ya_es_fecha
2025-07-15

DATE() también acepta cadenas en otros formatos que MySQL pueda parsear.

SELECT DATE('20250715143208') AS desde_cadena_compacta;
desde_cadena_compacta
2025-07-15

Caso práctico: comparar fechas ignorando la hora

El escenario más habitual para DATE() es comparar una columna DATETIME con una fecha específica. Sin la función, la comparación directa falla porque 2025-07-15 14:32:08 no es igual a 2025-07-15.

-- Sin DATE(): no encuentra resultados si fecha_pedido es DATETIME
SELECT * FROM pedidos
WHERE fecha_pedido = '2025-07-15';
 
-- Con DATE(): compara correctamente solo la fecha
SELECT id, cliente_id, total, fecha_pedido
FROM pedidos
WHERE DATE(fecha_pedido) = '2025-07-15';
idcliente_idtotalfecha_pedido
861042259.902025-07-15 14:32:08
87104384.502025-07-15 14:32:08

Es importante señalar que envolver la columna con DATE() impide que MySQL utilice un índice en esa columna de forma eficiente. Para consultas de alto rendimiento, es preferible usar un rango.

-- Alternativa optimizada que aprovecha índices
SELECT id, cliente_id, total, fecha_pedido
FROM pedidos
WHERE fecha_pedido >= '2025-07-15'
  AND fecha_pedido < '2025-07-16';

Esta alternativa produce los mismos resultados pero permite al optimizador de MySQL usar un índice en fecha_pedido.

Caso práctico: agrupar por fecha

Cuando tienes una tabla con timestamps detallados y necesitas generar un resumen diario, DATE() te permite agrupar todos los registros del mismo día.

SELECT DATE(fecha_pedido) AS dia,
       COUNT(*) AS total_pedidos,
       SUM(total) AS ingresos,
       ROUND(AVG(total), 2) AS ticket_promedio
FROM pedidos
WHERE fecha_pedido >= '2025-07-01'
GROUP BY DATE(fecha_pedido)
ORDER BY dia;
diatotal_pedidosingresosticket_promedio
2025-07-01121842.50153.54
2025-07-0291205.30133.92
2025-07-03152190.00146.00
2025-07-048980.75122.59
2025-07-05111567.20142.47

Sin DATE(), cada timestamp único formaría su propio grupo, resultando en una fila por cada pedido en lugar de una fila por cada día.

Caso práctico: encontrar registros del mismo día

DATE() facilita la búsqueda de eventos que ocurrieron en el mismo día sin importar la hora exacta. Por ejemplo, encontrar todos los pedidos realizados el mismo día que un pedido específico.

SELECT p2.id, p2.cliente_id, p2.total, p2.fecha_pedido
FROM pedidos p1
JOIN pedidos p2 ON DATE(p1.fecha_pedido) = DATE(p2.fecha_pedido)
WHERE p1.id = 86
  AND p2.id != 86
ORDER BY p2.fecha_pedido;
idcliente_idtotalfecha_pedido
87104384.502025-07-15 14:32:08

También puedes usar DATE() para verificar si dos eventos ocurrieron el mismo día.

SELECT p.id AS pedido_id, p.fecha_pedido,
       p.fecha_envio,
       CASE
           WHEN DATE(p.fecha_pedido) = DATE(p.fecha_envio) THEN 'Envío el mismo día'
           ELSE CONCAT('Envío tras ', DATEDIFF(DATE(p.fecha_envio), DATE(p.fecha_pedido)), ' días')
       END AS rapidez_envio
FROM pedidos p
WHERE p.fecha_envio IS NOT NULL;
pedido_idfecha_pedidofecha_enviorapidez_envio
862025-07-15 14:32:082025-07-15 16:45:33Envío el mismo día

Manejo de NULL

Si el argumento de DATE() es NULL, la función devuelve NULL. Es un comportamiento consistente con la mayoría de funciones en MySQL.

SELECT DATE(NULL) AS resultado_nulo;
resultado_nulo
NULL

Cuando aplicas DATE() a una columna que puede contener valores nulos, las filas con NULL producen NULL en el resultado.

SELECT id, fecha_envio,
       DATE(fecha_envio) AS dia_envio
FROM pedidos;
idfecha_enviodia_envio
862025-07-15 16:45:332025-07-15
87NULLNULL

Para manejar estos casos, utiliza COALESCE o IFNULL.

SELECT id,
       DATE(COALESCE(fecha_envio, fecha_pedido)) AS dia_referencia
FROM pedidos;
iddia_referencia
862025-07-15
872025-07-15

Si DATE() recibe una cadena con formato inválido, también devuelve NULL y genera una advertencia.

SELECT DATE('texto-invalido') AS resultado;
resultado
NULL

Combinación con otras funciones

DATE() se combina frecuentemente con funciones de comparación y aritmética de fechas.

SELECT DATE(NOW()) AS hoy,
       DATE(NOW() - INTERVAL 1 DAY) AS ayer,
       DATE(NOW() + INTERVAL 7 DAY) AS proxima_semana,
       DAYNAME(DATE(NOW())) AS dia_semana;
hoyayerproxima_semanadia_semana
2025-07-152025-07-142025-07-22Tuesday

Una combinación útil es con DATEDIFF para calcular la diferencia en días entre dos fechas, extrayendo primero la parte de fecha de valores DATETIME.

SELECT id, cliente_id,
       DATE(fecha_pedido) AS dia_pedido,
       DATE(fecha_envio) AS dia_envio,
       DATEDIFF(DATE(fecha_envio), DATE(fecha_pedido)) AS dias_hasta_envio
FROM pedidos
WHERE fecha_envio IS NOT NULL;
idcliente_iddia_pedidodia_enviodias_hasta_envio
8610422025-07-152025-07-150

Cabe mencionar que DATEDIFF ya extrae internamente la parte de fecha de sus argumentos, por lo que el uso de DATE() dentro de DATEDIFF es técnicamente redundante. Sin embargo, hace la intención del código más explícita y puede mejorar la legibilidad en consultas complejas.

En el siguiente artículo veremos TIME para extraer la parte de hora.

Escrito por Eduardo Lázaro