Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Holen Sie sich DATEDIFF ohne Wochenenden mit SQL Server

Beispielabfrage unten, hier sind einige Details dazu, wie ich sie gelöst habe.

Mit DATEDIFF(WK, ...) gibt uns die Anzahl der Wochen zwischen den 2 Daten. SQL Server wertet dies als Differenz zwischen den Wochenzahlen aus und nicht auf der Grundlage der Anzahl der Tage. Das ist perfekt, da wir damit feststellen können, wie viele Wochenenden zwischen den Daten vergangen sind.

Wir können diesen Wert also mit 2 multiplizieren, um die Anzahl der aufgetretenen Wochenendtage zu erhalten, und diese vom DATEDIFF(dd, ...) subtrahieren um die Anzahl der Wochentage zu erhalten.

Dies verhält sich jedoch nicht 100% korrekt, wenn das Start- oder Enddatum auf Sonntag fällt. Also habe ich am Ende der Berechnung etwas Logik hinzugefügt, um diese Instanzen zu behandeln.

Sie sollten auch überlegen, ob DATEDIFF sollte vollumfänglich inklusive sein. z.B. Ist der Unterschied zwischen 9/10 und 9/11 1 Tag oder 2 Tage? Im letzteren Fall sollten Sie dem Endprodukt 1 hinzufügen.

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