Ich muss eine gespeicherte Prozedur schreiben, die ein Startdatum, ein Enddatum und eine Häufigkeit (Tag, Woche, Monat, Quartal, Jahr) akzeptiert und eine Ergebnismenge basierend auf diesen Parametern ausgibt. Offensichtlich ist der einfache Teil die Abfrage nach Datumsbereich, aber wie gruppieren Sie nach Häufigkeit?
Wenn also ein Satz Rohdaten wie folgt ist:
%Vor%Und ich rufe meinen gespeicherten proc wie folgt auf:
sp_Report '1/1/2011', '12 / 31/2011 ',' Woche '
Ich würde Ergebnisse wie folgt erwarten:
%Vor%Es gibt ein paar Fragen hier:
1) Wie ermittele ich das Datum für das Ende der Woche (die Woche endet am Sonntag)?
2) Wie gruppiere ich nach diesem WeekOf-Datumsbereich?
Das folgende Skript stellt die Ausgabe einheitlich dar: Es zeigt das Start- und Enddatum des Zeitraums sowie die Gesamtzählung für den Zeitraum an.
Das hat auch die Wege zum Auffinden der Werte bestimmt, nach denen gruppiert werden soll. Grundsätzlich können Sie drei verschiedene Muster sehen: eins für die 'day'
-Frequenz, ein anderes für 'week'
und noch ein anderes für alle anderen Frequenzarten.
Der erste ist der einfachste: Sowohl PeriodStart als auch PeriodEnd sind nur Date
.
Seit Wochen verwende ich einen ziemlich bekannten Trick, wobei der erste Wochentag vom gegebenen Datum abgeleitet wird, indem von ihm ein Wert subtrahiert wird, der um eins kleiner als seine Wochentagsnummer ist. Das Ende der Woche wird ähnlich gefunden: Wir fügen lediglich 6
zu demselben Ausdruck hinzu.
Monate, Quartale und Jahre werden folgendermaßen gruppiert. Die ganze Zahl der entsprechenden Einheiten zwischen dem Nulldatum und dem angegebenen Datum wird dem Nulldatum hinzugefügt. Das gibt uns den Beginn der Periode. Das Ende ist sehr ähnlich, nur wir addieren die Zahl, die um eins größer ist als die Differenz. Das erzeugt den Anfang der nächsten -Periode, so dass wir dann einen Tag subtrahieren, was uns das korrekte Enddatum gibt.
%Vor% EXEC spReport '1/1/2011', '12/31/2011', 'day'
:
EXEC spReport '1/1/2011', '12/31/2011', 'week'
:
EXEC spReport '1/1/2011', '12/31/2011', 'month'
:
EXEC spReport '1/1/2011', '12/31/2011', 'quarter'
:
EXEC spReport '1/1/2011', '12/31/2011', 'year'
:
Hinweis: Aus MSDN :
Vermeiden Sie die Verwendung des sp _ Präfixes beim Benennen von Prozeduren. Dieses Präfix wird von SQL Server zum Festlegen von Systemprozeduren verwendet. Wenn das Präfix verwendet wird, kann der Anwendungscode beschädigt werden, wenn eine Systemprozedur mit demselben Namen vorhanden ist. Weitere Informationen finden Sie unter Entwerfen gespeicherter Prozeduren (Datenbankmodul) .
Tags und Links sql-server tsql date-range