Problem jest następujący. Potrzebna jest tabela wypełniona godzinami (lub datami), w oparciu o którą dalej będzie można budować wyrażenie JOIN dobierające dane z innej tabeli tak aby agregować wszystkie zdarzenia z danej godziny razem.
Oto moja propozycja:
CREATE PROCEDURE dbo.GetIntervals @dateTimeStart DATETIME, @countMax INT AS BEGIN CREATE TABLE #time ( StartInterval SMALLDATETIME, StopInterval SMALLDATETIME) DECLARE @i INT=0 WHILE(@i<@countMax) BEGIN INSERT #time VALUES(DATEADD(HOUR, @i, @dateTimeStart), DATEADD(HOUR, @i+1, @dateTimeStart)) SET @i+=1 END SELECT * FROM #time DROP TABLE #time ENDTworzymy procedurę, która jako parametr otrzymuje:
- datę początkową
- liczbę – ile interwałów godzinowych wygenerować
W procedurze tworzymy tymczasową tabelę, która jest wypełniana przez pętlę WHILE
Z tej tymczasowej tabeli wykonujemy SELECT.
Jak może wyglądać „konsumpcja” tak zwróconej tabelki? Oto moja propozycja:
CREATE TABLE #time ( StartInterval SMALLDATETIME, StopInterval SMALLDATETIME) INSERT #time EXEC dbo.GetIntervals '20130821 00:00′, 24 SELECT * FROM #time DROP TABLE #timeNa zewnątrz procedury, tworzymy własną tabelę tymczasową do przechowywania interwałów czasowych. Poleceniem INSERT wypełniamy tę tabelę. INSERT może przyjąć to co wyprodukowała procedura dzięki składni INSERT…EXEC…
Mając dane w tabeli tymczasowej, możemy budować nasze własne rozwiązanie raportowe.