DAY

La función DAY extrae el día del mes de una fecha y lo devuelve como un entero entre 1 y 31. Es un sinónimo exacto de DAYOFMONTH: ambas funciones hacen lo mismo, devuelven el mismo resultado y se pueden usar indistintamente. MySQL las mantiene como alias por compatibilidad y conveniencia.

Aunque extraer el día del mes puede parecer una operación simple, es fundamental para muchos escenarios de negocio: identificar fechas de facturación, detectar patrones de compra por día del mes, calcular plazos de pago o segmentar clientes según cuándo realizan sus transacciones.

Sintaxis

DAY(fecha)
-- o su sinónimo exacto:
DAYOFMONTH(fecha)

El argumento fecha acepta valores DATE, DATETIME, TIMESTAMP o una cadena con formato de fecha válido. Devuelve un entero de 1 a 31 según el día del mes. Si la fecha es '0000-00-00', devuelve 0.

Comportamiento básico

DAY devuelve simplemente el componente de día de la fecha proporcionada:

SELECT
    DAY('2025-08-01') AS primero,
    DAY('2025-08-15') AS quince,
    DAY('2025-08-31') AS ultimo,
    DAYOFMONTH('2025-08-15') AS con_dayofmonth;
primeroquinceultimocon_dayofmonth
1153115

Como puedes ver, DAY y DAYOFMONTH devuelven exactamente lo mismo. En la práctica, la mayoría de desarrolladores prefiere DAY porque es más corta de escribir. No hay ninguna diferencia de rendimiento ni de comportamiento entre ambas.

El rango depende del mes

El valor máximo que DAY puede devolver depende del mes y del año (por los años bisiestos). Febrero puede llegar hasta 28 o 29, algunos meses hasta 30 y otros hasta 31:

SELECT
    DAY('2024-02-29') AS feb_bisiesto,
    DAY('2025-02-28') AS feb_normal,
    DAY('2025-04-30') AS abril,
    DAY('2025-07-31') AS julio;
feb_bisiestofeb_normalabriljulio
29283031

Esto es importante cuando filtras por rangos de días, porque no todos los meses tienen los mismos días.

Caso práctico: identificar fechas de facturación

Muchas empresas facturan en fechas fijas del mes: el día 1, el 15 o el último día. DAY te permite identificar y filtrar estas fechas fácilmente:

SELECT
    id_factura,
    fecha_emision,
    cliente,
    importe
FROM facturas
WHERE DAY(fecha_emision) = 1
    AND YEAR(fecha_emision) = 2024
ORDER BY fecha_emision
LIMIT 5;
id_facturafecha_emisionclienteimporte
50102024-01-01Distribuciones Norte3400.00
50872024-02-01Distribuciones Norte3200.00
51562024-03-01Distribuciones Norte3650.00
52342024-04-01Distribuciones Norte3100.00
53122024-05-01Distribuciones Norte3800.00

Este patrón revela que el cliente "Distribuciones Norte" tiene una facturación recurrente el primer día de cada mes. Identificar estos patrones es clave para la gestión de tesorería y previsión de cobros.

Caso práctico: análisis de patrones de compra por día del mes

¿Compran más los clientes a principio de mes (recién cobrado el sueldo) o a final de mes? DAY combinado con GROUP BY responde esta pregunta:

SELECT
    CASE
        WHEN DAY(fecha_venta) BETWEEN 1 AND 10 THEN 'Principio (1-10)'
        WHEN DAY(fecha_venta) BETWEEN 11 AND 20 THEN 'Mediados (11-20)'
        ELSE 'Final (21-31)'
    END AS periodo_mes,
    COUNT(*) AS num_ventas,
    SUM(total) AS ingresos,
    ROUND(AVG(total), 2) AS ticket_medio
FROM ventas
WHERE YEAR(fecha_venta) = 2024
GROUP BY
    CASE
        WHEN DAY(fecha_venta) BETWEEN 1 AND 10 THEN 'Principio (1-10)'
        WHEN DAY(fecha_venta) BETWEEN 11 AND 20 THEN 'Mediados (11-20)'
        ELSE 'Final (21-31)'
    END
ORDER BY MIN(DAY(fecha_venta));
periodo_mesnum_ventasingresosticket_medio
Principio (1-10)1820318500.00175.00
Mediados (11-20)1650272250.00165.00
Final (21-31)1340214400.00160.00

Los datos confirman lo que la intuición sugiere: hay más ventas a principio de mes, probablemente correlacionado con el cobro de nóminas. Este tipo de análisis es valioso para planificar campañas de marketing y gestionar inventario.

Caso práctico: calcular días de retraso en pagos

En gestión de cobros, es habitual comparar el día de vencimiento con el día de pago real. DAY puede ayudarte a analizar estos patrones:

SELECT
    id_factura,
    fecha_vencimiento,
    fecha_pago,
    DAY(fecha_vencimiento) AS dia_vencimiento,
    DAY(fecha_pago) AS dia_pago,
    DATEDIFF(fecha_pago, fecha_vencimiento) AS dias_retraso
FROM facturas
WHERE fecha_pago > fecha_vencimiento
    AND YEAR(fecha_vencimiento) = 2024
ORDER BY dias_retraso DESC
LIMIT 5;
id_facturafecha_vencimientofecha_pagodia_vencimientodia_pagodias_retraso
52452024-03-152024-04-22152238
53012024-04-012024-05-031332
51782024-02-282024-03-25282525
54222024-06-102024-07-0110121
50892024-01-202024-02-0520516

En este ejemplo, DAY te permite ver los días concretos de vencimiento y pago, mientras que DATEDIFF calcula los días totales de retraso. Combinando ambas funciones obtienes un panorama completo del comportamiento de pago.

Caso práctico: distribución de pedidos por día del mes

Para visualizar cómo se distribuyen los pedidos a lo largo del mes, puedes agrupar directamente por DAY:

SELECT
    DAY(fecha_pedido) AS dia,
    COUNT(*) AS pedidos
FROM pedidos
WHERE YEAR(fecha_pedido) = 2024
    AND MONTH(fecha_pedido) = 6
GROUP BY DAY(fecha_pedido)
ORDER BY dia;
diapedidos
118
222
319
415
520
......
2811
299
308

Esta distribución día a día puede revelar patrones como picos los lunes (día de reabastecimiento), bajones los fines de semana o incrementos en días de pago.

DAY con NULL

DAY devuelve NULL cuando la fecha de entrada es NULL:

SELECT
    DAY(NULL) AS resultado,
    DAYOFMONTH(NULL) AS resultado2,
    DAY('0000-00-00') AS fecha_cero;
resultadoresultado2fecha_cero
NULLNULL0

Ambos sinónimos se comportan igual con NULL. Y al igual que las demás funciones de fecha, '0000-00-00' produce 0 en lugar de NULL.

Combinación con otras funciones

DAY se combina frecuentemente con LAST_DAY para detectar el último día del mes, y con YEAR y MONTH para construir fechas específicas:

SELECT
    fecha_venta,
    DAY(fecha_venta) AS dia,
    DAY(LAST_DAY(fecha_venta)) AS ultimo_dia_mes,
    DAY(LAST_DAY(fecha_venta)) - DAY(fecha_venta) AS dias_restantes_mes
FROM ventas
WHERE YEAR(fecha_venta) = 2024
    AND MONTH(fecha_venta) = 2
ORDER BY fecha_venta
LIMIT 5;
fecha_ventadiaultimo_dia_mesdias_restantes_mes
2024-02-0112928
2024-02-0332926
2024-02-0552924
2024-02-0882921
2024-02-10102919

Observa que febrero de 2024 tiene 29 días porque es bisiesto. LAST_DAY devuelve el último día del mes correspondiente a la fecha dada, y al aplicar DAY sobre ese resultado obtienes el número total de días del mes. Restar el día actual te da cuántos días faltan para que termine el mes, algo útil para cálculos de plazos y vencimientos.

En el siguiente artículo veremos HOUR para extraer la hora.

Escrito por Eduardo Lázaro