Mieliśmy podobny problem z raportami BIRT, ponieważ chcieliśmy raportować te dni, w których nie było danych. Ponieważ nie było wpisów dla tych dat, najłatwiejszym rozwiązaniem dla nas było utworzenie prostej tabeli przechowującej wszystkie daty i użycie jej do uzyskania zakresów lub łączenia, aby uzyskać zerowe wartości dla tej daty.
Mamy zadanie, które jest uruchamiane co miesiąc, aby zapewnić zapełnienie tabeli za 5 lat w przyszłość. Tabela jest tworzona w ten sposób:
create table all_dates (
dt date primary key
);
Bez wątpienia istnieją magiczne, trudne sposoby na zrobienie tego z różnymi DBMS, ale zawsze wybieramy najprostsze rozwiązanie. Wymagania dotyczące pamięci dla tabeli są minimalne, co sprawia, że zapytania są o wiele prostsze i przenośne. Tego rodzaju rozwiązanie jest prawie zawsze lepsze z punktu widzenia wydajności, ponieważ nie wymaga obliczeń danych dla każdego wiersza.
Inną opcją (i używaliśmy tego wcześniej) jest zapewnienie wpisu w tabeli dla każdej daty. Okresowo przeglądaliśmy tabelę i dodawaliśmy zero wpisów dla dat i / lub godzin, które nie istniały. W twoim przypadku może to nie być opcja, zależy to od przechowywanych danych.
Jeśli naprawdę uważasz, że utrzymywanie all_dates
wypełnienia tabeli jest kłopotliwe , najlepszym rozwiązaniem jest procedura składowana, która zwróci zestaw danych zawierający te daty. Będzie to prawie na pewno wolniejsze, ponieważ musisz obliczyć zakres za każdym razem, gdy jest wywoływany, zamiast po prostu pobierać wstępnie obliczone dane z tabeli.
Ale szczerze mówiąc, możesz wypełniać tabelę przez 1000 lat bez poważnych problemów z przechowywaniem danych - 365 000 16-bajtowych (na przykład) dat plus indeks powielający datę plus 20% narzut dla bezpieczeństwa, szacuję z grubsza na około 14 M [365 000 * 16 * 2 * 1,2 = 14 016 000 bajtów]), maleńka tabela w schemacie rzeczy.