Tema SQL
DATE_FORMAT() (MySQL / MariaDB)
Formatea un valor DATE/DATETIME/TIME a cadena según una máscara (%d/%m/%Y, nombres de mes, etc.). Es el análogo de presentación inverso a STR_TO_DATE.
Descripción
DATE_FORMAT(fecha, formato) no cambia el valor almacenado: solo produce una representación textual para SELECT, informes o exportaciones CSV. Para filtrar por rangos sigue comparando columnas de tipo fecha, no el resultado formateado (las comparaciones léxicas de cadenas dd/mm/yyyy pueden ordenarse mal si el formato no es ISO). En aplicaciones, suele ser preferible formatear en la capa de presentación y dejar SQL en tipos nativos. Los especificadores incluyen %W (día de la semana), %M (mes nombre), %H hora 24h, etc. La salida depende de lc_time_names si usas nombres localizados.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
DATE_FORMAT(fecha_o_hora, formato)
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- Solo presentación
- El resultado es cadena; no uses DATE_FORMAT en predicados de rango salvo casos muy controlados.
- Locale
- Nombres de día/mes dependen de configuración de sesión.
- Alternativa portable
- TO_CHAR en Oracle, FORMAT en SQL Server 2022+, funciones distintas en PostgreSQL.
Ejemplos
Ejemplo 1
SELECT DATE_FORMAT(NOW(), '%d/%m/%Y %H:%i') AS ahora_es;
SELECT id, DATE_FORMAT(creado_en, '%Y-%m') AS mes
FROM pedidos;
Ejemplo 2
SELECT DATE_FORMAT('2026-04-12 08:30:00', '%W %e de %M de %Y') AS legible_es;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.