post icon

Como obtener el último día hábil del mes con SQL Server

Es típico en informes de sistemas contables, financieros, bancarios o incluso comerciales necesitar obtener información en base al último día hábil del mes, y por desgracia no existe una función nativa en ningún lenguaje y no es la excepción SQL.

Calcularlo no es necesariamente difícil, pero sí existen formas y formas de hacerlo. Como ya habíamos visto anteriormente como generar un rango de filas cartesianas (de fechas en este caso), ahora derivaremos esta solución a algo más complejo.

Se requiere definir el primer día de la semana, yo lo asigno al domingo pero bien puede hacerse con lunes u otro día, con tal de cambiar luego en el where los igualadores al día domingo y sábado (por cierto, en mi query considero al sábado como un día no hábil, si para ustedes es hábil, sólo deben omitir el este bloque

when datepart(dw, eomonth(fecha)) = 7 then dateadd(day, -1, eomonth(fecha))

Para mi ejemplo, generaremos los últimos días hábiles de cada mes desde el 1 de enero de 2016 hasta el final del 2025. Como verán el bloque CTE generará todos los días en este rango de fecha, pero el where irá seleccionando solo el último con la función eomonth (recién disponible desde la versión 2012 de SQL Server.

Mi código no evalúa días feríados, asuetos ni especiales, si necesitan eso debería tener una tabla que registre cuales son estos días y agregar la lógica necesaria para filtrarlas y reemplazarlas según corresponda. El código completo va así:

set datefirst 7;

with    CTEFechas
          as (
               select
                cast('01/01/2016' as date) as fecha
               union all
               select
                dateadd(d, 1, fecha) as fecha
               from
                CTEFechas
               where
                fecha < '31/12/2025'
             )
    select
        *
    from
        CTEFechas
	where
        fecha = case when datepart(dw, eomonth(fecha)) = 1 then dateadd(day, -2, eomonth(fecha)) 
					 when datepart(dw, eomonth(fecha)) = 7 then dateadd(day, -1, eomonth(fecha))
					 else eomonth(fecha) end
option
        ( maxrecursion 0 );

Comentarios desde Facebook:

Sin Comentarios aun, puedes tú ser el primero en comentar!

Deja tu Comentario

Responder