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_pedido | fecha_sin_hora |
|---|---|
| 2025-07-12 18:40:55 | 2025-07-12 |
| 2025-07-14 09:15:22 | 2025-07-14 |
| 2025-07-15 14:32:08 | 2025-07-15 |
| 2025-07-15 14:32:08 | 2025-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';| id | cliente_id | total | fecha_pedido |
|---|---|---|---|
| 86 | 1042 | 259.90 | 2025-07-15 14:32:08 |
| 87 | 1043 | 84.50 | 2025-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;| dia | total_pedidos | ingresos | ticket_promedio |
|---|---|---|---|
| 2025-07-01 | 12 | 1842.50 | 153.54 |
| 2025-07-02 | 9 | 1205.30 | 133.92 |
| 2025-07-03 | 15 | 2190.00 | 146.00 |
| 2025-07-04 | 8 | 980.75 | 122.59 |
| 2025-07-05 | 11 | 1567.20 | 142.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;| id | cliente_id | total | fecha_pedido |
|---|---|---|---|
| 87 | 1043 | 84.50 | 2025-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_id | fecha_pedido | fecha_envio | rapidez_envio |
|---|---|---|---|
| 86 | 2025-07-15 14:32:08 | 2025-07-15 16:45:33 | Enví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;| id | fecha_envio | dia_envio |
|---|---|---|
| 86 | 2025-07-15 16:45:33 | 2025-07-15 |
| 87 | NULL | NULL |
Para manejar estos casos, utiliza COALESCE o IFNULL.
SELECT id,
DATE(COALESCE(fecha_envio, fecha_pedido)) AS dia_referencia
FROM pedidos;| id | dia_referencia |
|---|---|
| 86 | 2025-07-15 |
| 87 | 2025-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;| hoy | ayer | proxima_semana | dia_semana |
|---|---|---|---|
| 2025-07-15 | 2025-07-14 | 2025-07-22 | Tuesday |
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;| id | cliente_id | dia_pedido | dia_envio | dias_hasta_envio |
|---|---|---|---|---|
| 86 | 1042 | 2025-07-15 | 2025-07-15 | 0 |
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
