Como contar días entre fechas
La siguiente función para SQL Server permite contar la cantidad de días que existen entre un rango de fechas sin contar Sábados y Domingos.
CREATE FUNCTION [dbo].[DiasHabiles](@FechaInicio DATETIME,@FechaFin DATETIME)
RETURNS integer
AS
BEGIN
DECLARE @DiasNormales INT --Con esta variable calculamos cuantos dias "normales" hay en el rango de fechas
DECLARE @DiasHabiles INT --Con esta variable acumulamos los dias totales
DECLARE @Contador INT --Esta variable nos sirve de contador para saber cuando lleguemos al ultimo dia del rango
DECLARE @Aux_Fecha DATETIME --Esta variable es la que comparamos para saber si el dia que esta calculando es sábado o domingo*
/*Esta par de variables sirven para comparar las dos fechas, si son iguales, la funcion nos regresa un 0*/
DECLARE @Aux_FechaInicio VARCHAR(10)
DECLARE @Aux_FechaFin VARCHAR(10)
--Inicializamos algunas variables
SET @DiasNormales = 0
SET @DiasHabiles = 0
SET @Contador=0
--Calculamos cuantos dias normales hay en el rango de fechas
SELECT @DiasNormales = DATEDIFF(DAY,@FechaInicio,@FechaFin) + 1
/*Ordenamos el formato de las fechas para que no importando como se proporcionen se comparen igual*/
SELECT @Aux_FechaInicio = (SELECT CAST((CAST(datepart(dd,@FechaInicio)AS
VARCHAR(2))+'/'+ CAST(datepart(mm,@FechaInicio)AS
VARCHAR(2))+'/'+CAST(datepart(yy,@FechaInicio)AS VARCHAR(4))) as
varchar(10)))
SELECT @Aux_FechaFin = (SELECT CAST((CAST(datepart(dd,@FechaFin)AS
VARCHAR(2))+'/'+ CAST(datepart(mm,@FechaFin)AS VARCHAR(2))+'/'+
CAST(datepart(yy,@FechaFin)AS VARCHAR(4)))as varchar(10)))
--Se comparan las dos fechas
IF @Aux_FechaInicio <>@Aux_FechaFin
BEGIN
/*Si la diferencia de fechas es igual a dos, es porque solo ha transcurrido un dia, asi que solo se valida que no vaya a marcar dias de mas*/
IF @DiasNormales = 2
BEGIN
SELECT @DiasHabiles = 1
END
ELSE
BEGIN
WHILE @Contador < @DiasNormales
BEGIN
/*Se Iguala la fecha a que vamos a calcular para saber si es sabado o domingo en la variable @Aux_Fecha sumandole los dias que marque el contador, el cual no debe ser mayor que el numero total de dias que hay en el rango de fechas*/
SELECT @Aux_Fecha = @FechaInicio + @Contador
/*Utilizando la funcion datepart con el parametro dw que calcula que dia de la semana corresponde una fecha determinada, determinados que no sea sabado (7) o domingo (1)*/
IF ((datepart(dw,@Aux_Fecha) <> 1) and (datepart(dw,@Aux_Fecha) <> 7) )
BEGIN
/*Si no es sabado o domingo, entonces se suma uno al total de dias que queremos desplegar*/
SELECT @DiasHabiles = @DiasHabiles + 1
END
--Se suma un dia mas al contador
SELECT @Contador = @Contador + 1
END
END
END
ELSE
BEGIN
--Si fuese cierto que las fechas eran iguales se despliegue cero
SELECT @DiasHabiles = 0
END
--Al finalizar el ciclo, la funcion regresa el numero total de dias
RETURN(@DiasHabiles)
END
GO
Su uso es muy simple:
Select dbo.DiasHabiles('2015/07/13','2015/07/31') as DiasHabiles,DateDiff(d,'2015/07/13','2015/07/31') as DiasCorridos
En este ejemplo se puede ver la variación que existe entre la función DateDiff y nuestra función.