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;| primero | quince | ultimo | con_dayofmonth |
|---|---|---|---|
| 1 | 15 | 31 | 15 |
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_bisiesto | feb_normal | abril | julio |
|---|---|---|---|
| 29 | 28 | 30 | 31 |
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_factura | fecha_emision | cliente | importe |
|---|---|---|---|
| 5010 | 2024-01-01 | Distribuciones Norte | 3400.00 |
| 5087 | 2024-02-01 | Distribuciones Norte | 3200.00 |
| 5156 | 2024-03-01 | Distribuciones Norte | 3650.00 |
| 5234 | 2024-04-01 | Distribuciones Norte | 3100.00 |
| 5312 | 2024-05-01 | Distribuciones Norte | 3800.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_mes | num_ventas | ingresos | ticket_medio |
|---|---|---|---|
| Principio (1-10) | 1820 | 318500.00 | 175.00 |
| Mediados (11-20) | 1650 | 272250.00 | 165.00 |
| Final (21-31) | 1340 | 214400.00 | 160.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_factura | fecha_vencimiento | fecha_pago | dia_vencimiento | dia_pago | dias_retraso |
|---|---|---|---|---|---|
| 5245 | 2024-03-15 | 2024-04-22 | 15 | 22 | 38 |
| 5301 | 2024-04-01 | 2024-05-03 | 1 | 3 | 32 |
| 5178 | 2024-02-28 | 2024-03-25 | 28 | 25 | 25 |
| 5422 | 2024-06-10 | 2024-07-01 | 10 | 1 | 21 |
| 5089 | 2024-01-20 | 2024-02-05 | 20 | 5 | 16 |
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;| dia | pedidos |
|---|---|
| 1 | 18 |
| 2 | 22 |
| 3 | 19 |
| 4 | 15 |
| 5 | 20 |
| ... | ... |
| 28 | 11 |
| 29 | 9 |
| 30 | 8 |
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;| resultado | resultado2 | fecha_cero |
|---|---|---|
| NULL | NULL | 0 |
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_venta | dia | ultimo_dia_mes | dias_restantes_mes |
|---|---|---|---|
| 2024-02-01 | 1 | 29 | 28 |
| 2024-02-03 | 3 | 29 | 26 |
| 2024-02-05 | 5 | 29 | 24 |
| 2024-02-08 | 8 | 29 | 21 |
| 2024-02-10 | 10 | 29 | 19 |
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
