Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

obter DATEDIFF excluindo fins de semana usando sql server


Consulta de exemplo abaixo, aqui estão alguns detalhes sobre como eu resolvi isso.

Usando DATEDIFF(WK, ...) nos dará o número de semanas entre as 2 datas. O SQL Server avalia isso como uma diferença entre os números da semana em vez de com base no número de dias. Isso é perfeito, pois podemos usar isso para determinar quantos fins de semana se passaram entre as datas.

Assim, podemos multiplicar esse valor por 2 para obter o número de dias de fim de semana que ocorreram e subtrair isso de DATEDIFF(dd, ...) para obter o número de dias da semana.

Isso não se comporta 100% corretamente quando a data de início ou término cai no domingo. Então eu adicionei em algum caso lógica no final do cálculo para lidar com essas instâncias.

Você também pode querer considerar se o DATEDIFF deve ser totalmente inclusiva. por exemplo. A diferença entre 10/09 e 11/09 é 1 dia ou 2 dias? Se for o último, você desejará adicionar 1 ao produto 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