Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

ottenere DATEDIFF esclusi i fine settimana utilizzando il server sql

Esempio di query di seguito, ecco alcuni dettagli su come l'ho risolto.

Usando DATEDIFF(WK, ...) ci darà il numero di settimane tra le 2 date. SQL Server valuta questo come una differenza tra i numeri delle settimane anziché in base al numero di giorni. Questo è perfetto, poiché possiamo usarlo per determinare quanti fine settimana sono trascorsi tra le date.

Quindi possiamo moltiplicare quel valore per 2 per ottenere il numero di giorni del fine settimana che si sono verificati e sottrarlo da DATEDIFF(dd, ...) per ottenere il numero di giorni della settimana.

Tuttavia, questo non si comporta correttamente al 100% quando la data di inizio o di fine cade di domenica. Quindi ho aggiunto in alcuni casi la logica alla fine del calcolo per gestire quelle istanze.

Potresti anche voler considerare se il DATEDIFF dovrebbe essere completamente inclusivo. per esempio. La differenza tra 9/10 e 9/11 è 1 giorno o 2 giorni? In quest'ultimo caso, ti consigliamo di aggiungere 1 al prodotto finale.

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