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;
nombrefecha_contratacionmes_ingreso
Maria Garcia2023-03-15marzo
Carlos Rodriguez2022-07-01julio
Ana Martinez2024-01-08enero
Pedro Sanchez2023-11-20noviembre
Laura Fernandez2024-06-03junio

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);
mestotal_pedidosingresosticket_medio
enero15638420.50246.28
febrero14235100.80247.19
marzo17844250.30248.60
abril16540900.00247.88
mayo18948750.75257.94
junio20152100.20259.20
julio21558800.40273.49
agosto19851200.60258.59
septiembre17242300.90245.93
octubre18546500.30251.35
noviembre22062400.15283.64
diciembre24572800.50297.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);
mesingresos_2024ingresos_2025variacion_pct
enero32100.0038420.5019.7
febrero29800.5035100.8017.8
marzo37500.2044250.3018.0
abril35200.0040900.0016.2
mayo41600.3048750.7517.2
junio45100.8052100.2015.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;
categoriamesunidades_vendidas
Deportesenero45
Deportesfebrero38
Deportesmarzo52
Deportesabril67
Electrónicaenero89
Electrónicafebrero76
Electrónicamarzo82
Electrónicaabril71
Ropaenero120
Ropafebrero95
Ropamarzo105
Ropaabril130

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_nullresultado_invalido
NULLNULL

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);
periodopedidosingresos
octubre 202518546500.30
noviembre 202522062400.15
diciembre 202524572800.50
enero 202616039200.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;
idfecha_legibletotal
124714 de febrero de 2026189.50
124613 de febrero de 2026342.00
124512 de febrero de 202695.80

En el siguiente articulo veremos DAYOFWEEK para obtener el numero del dia de la semana.

Escrito por Eduardo Lázaro