Generowanie tabeli interwałów czasowych

21-sie-2013

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
END
 

Tworzymy 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 #time
 

Na 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.

Komentarze są wyłączone

Autor: Rafał Kraik