without weekends una restar operaciones fechas fecha example entre ejemplos dias con calcular sql-server-2005

sql-server-2005 - weekends - operaciones con fechas sql



obtener DATEDIFF excluyendo los fines de semana usando el servidor sql (6)

Estoy usando esta consulta para obtener tiempo.

SELECT DATEDIFF(dd, ActualStartDate, ActualCompletionDate) AS TimeTaken FROM TableName

Ahora quiero excluir los fines de semana y solo incluir los lunes a viernes como días contados.


Consulta de ejemplo a continuación, aquí hay algunos detalles sobre cómo lo resolví.

El uso de DATEDIFF(WK, ...) nos dará el número de semanas entre las 2 fechas. SQL Server evalúa esto como una diferencia entre los números de semana en lugar de según el número de días. Esto es perfecto, ya que podemos usar esto para determinar cuántos fines de semana pasaron entre las fechas.

Entonces, podemos multiplicar ese valor por 2 para obtener el número de días de fin de semana que ocurrió y restarlo del DATEDIFF(dd, ...) para obtener el número de días de la semana.

Sin embargo, esto no se comporta correctamente al 100% cuando la fecha de inicio o finalización es el domingo. Así que agregué en algunos casos lógica al final del cálculo para manejar esas instancias.

También es posible que desee considerar si el DATEDIFF debe ser totalmente inclusivo. por ejemplo, ¿la diferencia entre el 9/10 y el 9/11 es de 1 día o 2 días? Si es este último, querrá agregar 1 al producto final.

declare @d1 datetime, @d2 datetime select @d1 = ''9/9/2011'', @d2 = ''9/18/2011'' select datediff(dd, @d1, @d2) - (datediff(wk, @d1, @d2) * 2) - case when datepart(dw, @d1) = 1 then 1 else 0 end + case when datepart(dw, @d2) = 1 then 1 else 0 end


Cuando usé esto, encontré que había un problema cuando d1 cayó el sábado. Debajo está lo que solía corregir esto.

declare @d1 datetime, @d2 datetime select @d1 = ''11/19/2011'' , @d2 = ''11/28/2011'' select datediff(dd, @d1, @d2) +case when datepart(dw, @d1) = 7 then 1 else 0 end - (datediff(wk, @d1, @d2) * 2) - case when datepart(dw, @d1) = 1 then 1 else 0 end + case when datepart(dw, @d2) = 1 then 1 else 0 end


Solo quiero compartir el código que creé que podría ayudarte.

DECLARE @MyCounter int = 0, @TempDate datetime, @EndDate datetime; SET @TempDate = DATEADD(d,1,''2017-5-27'') SET @EndDate = ''2017-6-3'' WHILE @TempDate <= @EndDate BEGIN IF DATENAME(DW,@TempDate) = ''Sunday'' OR DATENAME(DW,@TempDate) = ''Saturday'' SET @MyCounter = @MyCounter ELSE IF @TempDate not in (''2017-1-1'', ''2017-1-16'', ''2017-2-20'', ''2017-5-29'', ''2017-7-4'', ''2017-9-4'', ''2017-10-9'', ''2017-11-11'', ''2017-12-25'') SET @MyCounter = @MyCounter + 1 SET @TempDate = DATEADD(d,1,@TempDate) CONTINUE END PRINT @MyCounter PRINT @TempDate

Si tiene una tabla de vacaciones, también puede usarla para no tener que enumerar todos los días festivos en la sección ELSE IF del código. También puede crear una función para este código y usar la función siempre que lo necesite en su consulta.

Espero que esto también ayude.


Usando https://.com/a/1804095 y la respuesta de JeffFisher30 anterior ( https://.com/a/14572370/6147425 ) y mi propia necesidad de tener días fraccionarios, escribí esto:

DateDiff(second,Start_Time,End_Time)/86400.0 -2*DateDiff(week, Start_Time, End_Time) -Case When (DatePart(weekday, Start_Time)+@@DateFirst)%7 = 1 Then 1 Else 0 End +Case When (DatePart(weekday, End_Time)+@@DateFirst)%7 = 1 Then 1 Else 0 End


BEGIN DECLARE @totaldays INT; DECLARE @weekenddays INT; SET @totaldays = DATEDIFF(DAY, @startDate, @endDate) SET @weekenddays = ((DATEDIFF(WEEK, @startDate, @endDate) * 2) + -- get the number of weekend days in between CASE WHEN DATEPART(WEEKDAY, @startDate) = 1 THEN 1 ELSE 0 END + -- if selection was Sunday, won''t add to weekends CASE WHEN DATEPART(WEEKDAY, @endDate) = 6 THEN 1 ELSE 0 END) -- if selection was Saturday, won''t add to weekends Return (@totaldays - @weekenddays)

FIN

Esto es en SQL Server 2014


declare @d1 datetime, @d2 datetime select @d1 = ''4/19/2017'', @d2 = ''5/7/2017'' DECLARE @Counter int = datediff(DAY,@d1 ,@d2 ) DECLARE @C int = 0 DECLARE @SUM int = 0 WHILE @Counter > 0 begin SET @SUM = @SUM + IIF(DATENAME(dw, DATEADD(day,@c,@d1))IN(''Sunday'',''Monday'',''Tuesday'',''Wednesday'',''Thursday'') ,1,0) SET @Counter = @Counter - 1 set @c = @c +1 end select @Sum