← maurobernal.com.ar

Etiqueta: días

  • Contar días hábiles entre una fecha

    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
    
    

     

     

    Resultado_contar_fechas

    En este ejemplo se puede ver la variación que existe entre la función DateDiff y nuestra función.

  • Contar días sin Sábado ni Domingo

    Como contar cuántos días hay en un período sin contar sábados y domingo

    La siguiente es una  función en TSQL de MS SQL Server, la cúal permite saber la cantidad de días que existe en un período determinado sin contar los fines de semana (sábado y domingo).

    --Primeramente declaramos que vamos a crear una funcion, en este caso se llama Dif Dias y recibe dos parámetros, la fecha inicial del período y la final*/ 
    CREATE FUNCTION [dbo].[DifDias](@StartDate DATETIME,@EndDate DATETIME) 
     RETURNS integer 
     AS 
     Begin 
    
    		DECLARE @DaysBetween INT  --Con esta variable calculamos cuantos dias "normales" hay en el rango de fechas 
    		DECLARE @BusinessDays INT  --Con esta variable acumulamos los dias totales 
    		DECLARE @Cnt INT --esta variable nos sirve de contador para saber cuando lleguemos al ultimo dia del rango 
    		DECLARE @EvalDate 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 @ini VARCHAR(10) 
    		DECLARE @fin VARCHAR(10) 
    
    		--Inicializamos algunas variables 
    
    		 SET @DaysBetween = 0 
    		 SET @BusinessDays = 0 
    		 SET @Cnt=0 
    
    		--Calculamos cuantos dias normales hay en el rango de fechas  
    		SELECT @DaysBetween = DATEDIFF(DAY,@StartDate,@EndDate) + 1 
    
    		/*Ordenamos el formato de las fechas para que no importando como se proporcionen se comparen igual*/ 
    
    		SELECT @ini = (SELECT CAST((CAST(datepart(dd,@StartDate)AS 
    						VARCHAR(2))+'/'+ CAST(datepart(mm,@StartDate)AS 
    						VARCHAR(2))+'/'+CAST(datepart(yy,@StartDate)AS VARCHAR(4))) as 
    						varchar(10))) 
    		SELECT @fin = (SELECT CAST((CAST(datepart(dd,@EndDate)AS 
    						VARCHAR(2))+'/'+ CAST(datepart(mm,@EndDate)AS VARCHAR(2))+'/'+ 
    						CAST(datepart(yy,@EndDate)AS VARCHAR(4)))as varchar(10))) 
    
    
    		--Se comparan las dos fechas 
    
    		IF @ini <>@fin 
    		 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 @DaysBetween = 2 
    		 BEGIN 
    		 SELECT @BusinessDays = 1 
    		 END 
    		 ELSE 
    		 BEGIN 
    		 WHILE @Cnt < @DaysBetween 
    		 BEGIN 
    
    		/*Se Iguala la fecha a que vamos a calcular para saber si es sabado o domingo en la variable @EvalDate 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 @EvalDate = @StartDate + @Cnt 
    
    		/*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,@EvalDate) <> 1) and 
    		 (datepart(dw,@EvalDate) <> 7) ) 
    		 BEGIN 
    
    		/*Si no es sabado o domingo, entonces se suma uno al total de dias que queremos desplegar*/ 
    
    		SELECT @BusinessDays = @BusinessDays + 1 
    		 END 
    
    		--Se suma un dia mas al contador 
    
    		SELECT @Cnt = @Cnt + 1 
    		 END 
    		 END 
    		 END 
    		 ELSE 
    		 BEGIN 
    
    		--Si fuese cierto que las fechas eran iguales se despliegue cero 
    
    		SELECT @BusinessDays = 0 
    		 END 
    		 
    		 
    		 
    		--Al finalizar el ciclo, la funcion regresa el numero total de dias 
    
    		return (@BusinessDays) 
    		 END
    
    GO
    

    Ejemplo de Uso:

    SELECT  dbo.DifDias('06/01/2015', '06/30/2015')  as DiasAbril

    contar dias-sin-sabado-ni-domingo

Tags

tsql (27)mssql (26)sql (20)devops (20)dotnet (18)docker (15)performance (14)contenedores (11)dotnet10 (10)linux (9)csharp (8)microservicios (7)angular (7)angular21 (7)sql server (6)issabel (6)docker-compose (6)typescript (6)mysql (5).NET (5)