2 Stimmen

Anzahl der Wochen zwischen den Tagen in SQL Server 2005 zählen

Ich bin wieder hier, um Hilfe zu bekommen. Dies ist, was ich zu tun versuche. Ich habe eine Funktion oder sp, die 3 Parameter nimmt. startdate, enddate, y dayofweek (m, t, w usw.), müssen Sie zählen, wie viele Wochen zwischen dem Anfangs- und dem Enddatum liegen.

Beispiel: Wenn ich startday=2011-05-02 , enddate=2011-05-10 y dayofweek als Dienstag, es sollte 2 zählen, wenn ich passe dayofweek als Mittwoch, dann sollte es 1 zählen.

Ich bin in der Lage, mit diesem Code zu arbeiten, gibt es eine bessere Möglichkeit, dies zu tun? Die ClosingStartDate auf das korrekte Startdatum angepasst, das auf dem dayofweek verwendet. Im Grunde fügt der Code also 1 Woche zur runningdate und das laufende Datum wird entsprechend der verwendeten Woche angepasst.

Gibt es eine andere Möglichkeit, dies ohne die while-Schleife zu tun?

declare @NoofPeriods int
declare @runningdate datetime

 set @runningdate = @ClosingStartDate
 set @NoofPeriods=0
 while (@runningdate <= @NextStatementClosingdate)
  begin
    set @NoofPeriods=@NoofPeriods+1
    set @runningdate = Dateadd(day,7,@runningdate)
  end

5voto

George Penzenik Punkte 106

Sie ist bereits in SQL 2005 integriert.

SELECT DATEDIFF(week, @startdate, @enddate)

2voto

slothrop Punkte 1017

Ich bin wahrscheinlich nicht auf mit der SQL Server-Syntax, aber Logik wie diese sollte funktionieren. Verwenden Sie grundsätzlich Modulo-7-Arithmetik, um festzustellen, wie viele "ungerade" Tage Sie zu Beginn des Zeitraums haben, und ob diese einen der von Ihnen gewählten Wochentage enthalten (wie durch Ihre dayofweek ) oder nicht.

@diffInDays = SELECT DATEDIFF(day, @startdate, @enddate)

@startDateDay = SELECT DATEPART(weekday, @startdate)

set @diffInWholeWeeks = @diffInDays / 7
set @diffRemainderDays = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek - @startDateDay ) % 7 )
  begin
    set @extraWeek = 1
  end
else
  begin
    set @extraWeek = 0
  end

set @answer = @diffInWholeWeeks + @extraWeek

1voto

CStroliaDavis Punkte 382

Die Antwort von @slothrop ist fast genau richtig, daher werde ich mich auf diesen Code stützen und die Antwort hochstufen.

Okay, dieser Kommentar war falsch (bitte ignorieren):


Da die Tage von 1-7 und nicht von 0-6 gezählt werden, müssen wir dies berücksichtigen. Ich mache das, indem ich nach dem zweiten Modulus einen abziehe. Ich habe nicht alle Szenarien getestet, aber es scheint zu funktionieren.


Was mich gestört hat, war die Verschiebung der Woche. Fügen Sie 7 zum Tag der Woche hinzu, um sicherzustellen, dass der Mod funktioniert.

Das sollte funktionieren,

--Setup
DECLARE @dayofweek int = 4
DECLARE @startdate datetime = '5/2/2011'
DECLARE @enddate datetime = '5/10/2011'

--Solution
DECLARE @diffInDays int = DATEDIFF(day, @startdate, @enddate);
DECLARE @startDateDay int = DATEPART(weekday, @startdate);
DECLARE @extraWeek int = 0;

DECLARE @diffInWholeWeeks int = @diffInDays / 7
DECLARE @diffRemainderDays int = @diffInDays % 7

if @diffRemainderDays >= ( ( @dayofweek + 7 - @startDateDay ) % 7 )
    set @extraWeek = 1

DECLARE @answer int = @diffInWholeWeeks + @extraWeek

SELECT @answer 

Hinweis: Ich bin nicht sicher, ob die Inline-Einstellung von Deklarationen in 2005 unterstützt wird. Wenn ja, verwenden Sie einfach eine SET- oder SELECT-Anweisung, um die Werte zu setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X