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
En este ejemplo se puede ver la variación que existe entre la función DateDiff y nuestra función.
NO FUNCIONA RETORNA VALORES EN 0.
Que rango de fechas le estás colocando?
Acabo de probarlo nuevamente en una versión de SQL Server 2012, y en un 2008 R2 y funciona…
Te paso el ejemplo que usa ahora:
select GETDATE() as hoy
Select dbo.DiasHabiles(‘2016/01/01′,GETDATE()) as DiasHabiles,DateDiff(d,’2016/01/01’,getdate()) as DiasCorridos
Los resultados son:
[hoy]
2016-05-02 10:03:24.123
[DiasHabiles] [DiasCorridos]
87 122
Hola Mauro
Quisiera saber si me apoyas estoy tratando de hacer una consulta o una función en Mysql, el objetivo es comparar la fecha de sistema contra un campo de fecha que erróneamente esta como tipo varchar no se si eso afecte mi resultado y de ahi tomar la diferencia de días solo hábiles.Me imagino que es muy parecido al ejemplo que expusiste en tu foro, no se si este ejemplo me sirva o como debe ejecutarlo.
Podrás ayudarme?
Saludos.
Primero deberías convertir la de cadena de texto (varchar) al tipo fecha (date time).
Pero depende del formato que tenga tu cadena de texto. Para ello tienes la función STR_TO_DATE en MYSQL:
SELECT STR_TO_DATE(cadenadetexto, ‘%m/%d/%Y’) FROM TableX
https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html