DAYNAME
La funcion DAYNAME() devuelve el nombre del dia de la semana correspondiente a una fecha. En lugar de obtener un numero como 1 o 5, obtienes directamente la cadena con el nombre del dia: Monday, Tuesday, etc. (o su equivalente en el idioma configurado en la sesion). Esta funcion resulta especialmente util cuando necesitas generar reportes legibles o agrupar datos por dia de la semana mostrando nombres en lugar de numeros.
Sintaxis
DAYNAME(fecha)El parametro fecha acepta un valor de tipo DATE o DATETIME. La funcion devuelve una cadena de texto con el nombre del dia de la semana. Si la fecha es NULL o no es valida, DAYNAME() devuelve NULL.
Un detalle importante es que el nombre devuelto depende del valor de la variable de sesion lc_time_names. Por defecto MySQL usa el locale en_US, lo que significa que devuelve nombres en ingles. Si necesitas nombres en espanol, debes cambiar esta variable antes de ejecutar tu consulta.
Comportamiento basico
La forma mas directa de usar DAYNAME() es pasarle una fecha literal:
SELECT DAYNAME('2026-02-14') AS dia;| dia |
|---|
| Saturday |
Para obtener el nombre del dia en espanol, configura el locale de la sesion:
SET lc_time_names = 'es_ES';
SELECT DAYNAME('2026-02-14') AS dia;| dia |
|---|
| sabado |
Esta configuracion solo afecta a la sesion actual. No modifica el comportamiento global del servidor ni afecta a otros usuarios conectados. Si cierras la conexion y abres una nueva, volvera al valor por defecto.
Tambien puedes usar DAYNAME() con columnas de una tabla:
SELECT
nombre,
fecha_contratacion,
DAYNAME(fecha_contratacion) AS dia_contratacion
FROM empleados
LIMIT 5;| nombre | fecha_contratacion | dia_contratacion |
|---|---|---|
| Maria Garcia | 2023-03-15 | miercoles |
| Carlos Rodriguez | 2022-07-01 | viernes |
| Ana Martinez | 2024-01-08 | lunes |
| Pedro Sanchez | 2023-11-20 | lunes |
| Laura Fernandez | 2024-06-03 | lunes |
Caso practico: agrupar ventas por dia de la semana
Uno de los usos mas habituales de DAYNAME() es analizar patrones de ventas segun el dia de la semana. Imagina que gestionas una tienda online y quieres saber que dias se vende mas:
SET lc_time_names = 'es_ES';
SELECT
DAYNAME(fecha_pedido) AS dia_semana,
COUNT(*) AS total_pedidos,
SUM(total) AS ingresos
FROM pedidos
WHERE fecha_pedido BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY DAYNAME(fecha_pedido);| dia_semana | total_pedidos | ingresos |
|---|---|---|
| lunes | 187 | 45320.50 |
| martes | 162 | 38750.80 |
| miercoles | 174 | 41200.30 |
| jueves | 195 | 48900.00 |
| viernes | 231 | 62450.75 |
| sabado | 145 | 35100.20 |
| domingo | 98 | 22800.40 |
El resultado muestra claramente que el viernes es el dia con mas actividad comercial. Sin embargo, hay un problema con esta consulta: los dias aparecen en orden alfabetico (o en el orden en que MySQL los encuentra), no en el orden natural de la semana.
Caso practico: ordenar los dias de la semana correctamente
Para ordenar los resultados en el orden natural de lunes a domingo, necesitas combinar DAYNAME() con DAYOFWEEK(). Esta ultima funcion devuelve un numero del 1 al 7 que puedes usar en la clausula ORDER BY:
SET lc_time_names = 'es_ES';
SELECT
DAYNAME(fecha_pedido) AS dia_semana,
COUNT(*) AS total_pedidos,
SUM(total) AS ingresos
FROM pedidos
WHERE fecha_pedido BETWEEN '2025-01-01' AND '2025-12-31'
GROUP BY DAYNAME(fecha_pedido), DAYOFWEEK(fecha_pedido)
ORDER BY DAYOFWEEK(fecha_pedido);| dia_semana | total_pedidos | ingresos |
|---|---|---|
| domingo | 98 | 22800.40 |
| lunes | 187 | 45320.50 |
| martes | 162 | 38750.80 |
| miercoles | 174 | 41200.30 |
| jueves | 195 | 48900.00 |
| viernes | 231 | 62450.75 |
| sabado | 145 | 35100.20 |
Ten en cuenta que DAYOFWEEK() sigue el estandar ODBC donde 1 es domingo y 7 es sabado. Si prefieres que lunes sea el primer dia, puedes ajustar el orden con una expresion como MOD(DAYOFWEEK(fecha_pedido) + 5, 7) o usar WEEKDAY() que empieza en lunes con valor 0.
Caso practico: reporte de asistencia laboral
Supongamos que necesitas verificar cuantos registros de asistencia hay por cada dia laborable para detectar anomalias:
SET lc_time_names = 'es_ES';
SELECT
DAYNAME(fecha_registro) AS dia,
COUNT(*) AS registros,
COUNT(DISTINCT empleado_id) AS empleados_unicos,
ROUND(AVG(TIMESTAMPDIFF(MINUTE, hora_entrada, hora_salida)) / 60, 1) AS horas_promedio
FROM asistencia
WHERE fecha_registro BETWEEN '2025-06-01' AND '2025-06-30'
AND DAYOFWEEK(fecha_registro) BETWEEN 2 AND 6
GROUP BY DAYNAME(fecha_registro), DAYOFWEEK(fecha_registro)
ORDER BY DAYOFWEEK(fecha_registro);| dia | registros | empleados_unicos | horas_promedio |
|---|---|---|---|
| lunes | 88 | 22 | 8.2 |
| martes | 86 | 22 | 8.4 |
| miercoles | 90 | 23 | 8.3 |
| jueves | 85 | 21 | 8.1 |
| viernes | 78 | 20 | 7.6 |
El filtro DAYOFWEEK(fecha_registro) BETWEEN 2 AND 6 descarta sabados y domingos. El resultado revela que los viernes hay menos asistencia y las jornadas promedio son mas cortas, algo comun en empresas con horario flexible.
Manejo de NULL
Cuando DAYNAME() recibe un valor NULL, devuelve NULL sin generar error:
SELECT DAYNAME(NULL) AS resultado;| resultado |
|---|
| NULL |
Lo mismo ocurre con fechas no validas:
SELECT DAYNAME('2025-02-30') AS resultado;| resultado |
|---|
| NULL |
El 30 de febrero no existe, asi que MySQL no puede determinar el dia de la semana y devuelve NULL. En consultas reales donde alguna columna de fecha pueda contener nulos, puedes usar COALESCE para proporcionar un valor por defecto:
SELECT
nombre,
COALESCE(DAYNAME(fecha_baja), 'Activo') AS estado_dia
FROM empleados;Combinacion con otras funciones
DAYNAME() se combina frecuentemente con funciones de agregacion y otras funciones de fecha. Por ejemplo, puedes usarla junto con CASE para clasificar dias en laborables y fines de semana:
SET lc_time_names = 'es_ES';
SELECT
fecha_pedido,
DAYNAME(fecha_pedido) AS dia,
CASE
WHEN DAYOFWEEK(fecha_pedido) IN (1, 7) THEN 'Fin de semana'
ELSE 'Laborable'
END AS tipo_dia,
total
FROM pedidos
ORDER BY fecha_pedido DESC
LIMIT 8;| fecha_pedido | dia | tipo_dia | total |
|---|---|---|---|
| 2026-02-14 | sabado | Fin de semana | 189.50 |
| 2026-02-13 | viernes | Laborable | 342.00 |
| 2026-02-12 | jueves | Laborable | 95.80 |
| 2026-02-11 | miercoles | Laborable | 278.30 |
| 2026-02-10 | martes | Laborable | 156.40 |
| 2026-02-09 | lunes | Laborable | 445.00 |
| 2026-02-08 | domingo | Fin de semana | 67.90 |
| 2026-02-07 | sabado | Fin de semana | 210.50 |
Tambien puedes combinar DAYNAME() con DATE_FORMAT() para construir cadenas descriptivas:
SET lc_time_names = 'es_ES';
SELECT
CONCAT(DAYNAME(fecha_pedido), ', ', DATE_FORMAT(fecha_pedido, '%d de %M de %Y')) AS fecha_completa,
total
FROM pedidos
ORDER BY fecha_pedido DESC
LIMIT 3;| fecha_completa | total |
|---|---|
| sabado, 14 de febrero de 2026 | 189.50 |
| viernes, 13 de febrero de 2026 | 342.00 |
| jueves, 12 de febrero de 2026 | 95.80 |
En el siguiente articulo veremos MONTHNAME para obtener el nombre del mes.
Escrito por Eduardo Lázaro
