MONTHNAME
La funcion MONTHNAME() devuelve el nombre completo del mes correspondiente a una fecha. En lugar de obtener el numero 3, obtienes directamente la cadena "March" (o "marzo" si configuras el locale en espanol). Es la funcion ideal cuando necesitas que tus reportes y consultas muestren nombres de meses legibles en lugar de numeros, algo fundamental en informes destinados a usuarios finales.
Sintaxis
MONTHNAME(fecha)El parametro fecha puede ser un valor de tipo DATE o DATETIME. La funcion devuelve una cadena de texto con el nombre completo del mes. Si la fecha es NULL o invalida, el resultado sera NULL.
Al igual que DAYNAME(), el idioma del nombre devuelto depende de la variable de sesion lc_time_names. Por defecto MySQL devuelve nombres en ingles. Para obtener nombres en espanol necesitas configurar el locale antes de ejecutar la consulta.
Comportamiento basico
La forma mas sencilla de usar MONTHNAME() es con una fecha literal:
SELECT MONTHNAME('2026-02-14') AS mes;| mes |
|---|
| February |
Para obtener el resultado en espanol:
SET lc_time_names = 'es_ES';
SELECT MONTHNAME('2026-02-14') AS mes;| mes |
|---|
| febrero |
Puedes aplicar MONTHNAME() directamente sobre columnas de tipo fecha en tus tablas:
SET lc_time_names = 'es_ES';
SELECT
nombre,
fecha_contratacion,
MONTHNAME(fecha_contratacion) AS mes_ingreso
FROM empleados
LIMIT 5;| nombre | fecha_contratacion | mes_ingreso |
|---|---|---|
| Maria Garcia | 2023-03-15 | marzo |
| Carlos Rodriguez | 2022-07-01 | julio |
| Ana Martinez | 2024-01-08 | enero |
| Pedro Sanchez | 2023-11-20 | noviembre |
| Laura Fernandez | 2024-06-03 | junio |
Caso practico: ingresos mensuales con nombres de mes
El caso de uso mas tipico de MONTHNAME() es generar reportes mensuales donde los meses se muestren con su nombre en lugar de un numero. Sin embargo, cuando agrupas por nombre de mes, necesitas garantizar que el resultado aparezca en orden cronologico. Para ello combinas MONTHNAME() con MONTH():
SET lc_time_names = 'es_ES';
SELECT
MONTHNAME(fecha_pedido) AS mes,
COUNT(*) AS total_pedidos,
ROUND(SUM(total), 2) AS ingresos,
ROUND(AVG(total), 2) AS ticket_medio
FROM pedidos
WHERE YEAR(fecha_pedido) = 2025
GROUP BY MONTH(fecha_pedido), MONTHNAME(fecha_pedido)
ORDER BY MONTH(fecha_pedido);| mes | total_pedidos | ingresos | ticket_medio |
|---|---|---|---|
| enero | 156 | 38420.50 | 246.28 |
| febrero | 142 | 35100.80 | 247.19 |
| marzo | 178 | 44250.30 | 248.60 |
| abril | 165 | 40900.00 | 247.88 |
| mayo | 189 | 48750.75 | 257.94 |
| junio | 201 | 52100.20 | 259.20 |
| julio | 215 | 58800.40 | 273.49 |
| agosto | 198 | 51200.60 | 258.59 |
| septiembre | 172 | 42300.90 | 245.93 |
| octubre | 185 | 46500.30 | 251.35 |
| noviembre | 220 | 62400.15 | 283.64 |
| diciembre | 245 | 72800.50 | 297.14 |
La clave esta en incluir MONTH(fecha_pedido) tanto en el GROUP BY como en el ORDER BY. Si ordenaras directamente por MONTHNAME(), los meses aparecerian en orden alfabetico (abril, agosto, diciembre...), que no es el orden cronologico natural.
Caso practico: comparar meses entre anos
Cuando necesitas comparar el rendimiento de un mismo mes en diferentes anos, MONTHNAME() te permite presentar el resultado de forma clara:
SET lc_time_names = 'es_ES';
SELECT
MONTHNAME(fecha_pedido) AS mes,
SUM(CASE WHEN YEAR(fecha_pedido) = 2024 THEN total ELSE 0 END) AS ingresos_2024,
SUM(CASE WHEN YEAR(fecha_pedido) = 2025 THEN total ELSE 0 END) AS ingresos_2025,
ROUND(
(SUM(CASE WHEN YEAR(fecha_pedido) = 2025 THEN total ELSE 0 END) -
SUM(CASE WHEN YEAR(fecha_pedido) = 2024 THEN total ELSE 0 END)) /
NULLIF(SUM(CASE WHEN YEAR(fecha_pedido) = 2024 THEN total ELSE 0 END), 0) * 100,
1) AS variacion_pct
FROM pedidos
WHERE YEAR(fecha_pedido) IN (2024, 2025)
GROUP BY MONTH(fecha_pedido), MONTHNAME(fecha_pedido)
ORDER BY MONTH(fecha_pedido);| mes | ingresos_2024 | ingresos_2025 | variacion_pct |
|---|---|---|---|
| enero | 32100.00 | 38420.50 | 19.7 |
| febrero | 29800.50 | 35100.80 | 17.8 |
| marzo | 37500.20 | 44250.30 | 18.0 |
| abril | 35200.00 | 40900.00 | 16.2 |
| mayo | 41600.30 | 48750.75 | 17.2 |
| junio | 45100.80 | 52100.20 | 15.5 |
Este tipo de reporte permite a los responsables comerciales ver de un vistazo la evolucion mensual. El uso de MONTHNAME() hace que la columna sea autoexplicativa sin necesidad de una leyenda adicional.
Caso practico: estacionalidad de productos
Puedes combinar MONTHNAME() con informacion de productos para detectar patrones estacionales:
SET lc_time_names = 'es_ES';
SELECT
c.nombre AS categoria,
MONTHNAME(p.fecha_pedido) AS mes,
COUNT(*) AS unidades_vendidas
FROM pedidos p
JOIN detalle_pedidos dp ON p.id = dp.pedido_id
JOIN productos pr ON dp.producto_id = pr.id
JOIN categorias c ON pr.categoria_id = c.id
WHERE YEAR(p.fecha_pedido) = 2025
AND c.nombre IN ('Electrónica', 'Ropa', 'Deportes')
GROUP BY c.nombre, MONTH(p.fecha_pedido), MONTHNAME(p.fecha_pedido)
ORDER BY c.nombre, MONTH(p.fecha_pedido)
LIMIT 12;| categoria | mes | unidades_vendidas |
|---|---|---|
| Deportes | enero | 45 |
| Deportes | febrero | 38 |
| Deportes | marzo | 52 |
| Deportes | abril | 67 |
| Electrónica | enero | 89 |
| Electrónica | febrero | 76 |
| Electrónica | marzo | 82 |
| Electrónica | abril | 71 |
| Ropa | enero | 120 |
| Ropa | febrero | 95 |
| Ropa | marzo | 105 |
| Ropa | abril | 130 |
Manejo de NULL
MONTHNAME() devuelve NULL cuando recibe un valor nulo o una fecha invalida:
SELECT
MONTHNAME(NULL) AS resultado_null,
MONTHNAME('2025-00-15') AS resultado_invalido;| resultado_null | resultado_invalido |
|---|---|
| NULL | NULL |
El mes 0 no es un mes valido, por lo que MySQL devuelve NULL. Si trabajas con columnas que pueden contener valores nulos, puedes usar IFNULL o COALESCE para proporcionar un texto alternativo:
SET lc_time_names = 'es_ES';
SELECT
nombre,
COALESCE(MONTHNAME(fecha_baja), 'En activo') AS mes_baja
FROM empleados;Combinacion con otras funciones
MONTHNAME() se integra bien con CONCAT() para construir etiquetas descriptivas:
SET lc_time_names = 'es_ES';
SELECT
CONCAT(MONTHNAME(fecha_pedido), ' ', YEAR(fecha_pedido)) AS periodo,
COUNT(*) AS pedidos,
ROUND(SUM(total), 2) AS ingresos
FROM pedidos
WHERE fecha_pedido >= '2025-10-01'
GROUP BY YEAR(fecha_pedido), MONTH(fecha_pedido),
MONTHNAME(fecha_pedido)
ORDER BY YEAR(fecha_pedido), MONTH(fecha_pedido);| periodo | pedidos | ingresos |
|---|---|---|
| octubre 2025 | 185 | 46500.30 |
| noviembre 2025 | 220 | 62400.15 |
| diciembre 2025 | 245 | 72800.50 |
| enero 2026 | 160 | 39200.80 |
Tambien es habitual usar MONTHNAME() junto con DATE_FORMAT() para personalizar la presentacion de fechas completas:
SET lc_time_names = 'es_ES';
SELECT
id,
CONCAT(DAY(fecha_pedido), ' de ', MONTHNAME(fecha_pedido), ' de ', YEAR(fecha_pedido)) AS fecha_legible,
total
FROM pedidos
ORDER BY fecha_pedido DESC
LIMIT 3;| id | fecha_legible | total |
|---|---|---|
| 1247 | 14 de febrero de 2026 | 189.50 |
| 1246 | 13 de febrero de 2026 | 342.00 |
| 1245 | 12 de febrero de 2026 | 95.80 |
En el siguiente articulo veremos DAYOFWEEK para obtener el numero del dia de la semana.
Escrito por Eduardo Lázaro
