Zadatak se svodi na pronalazenje ukupnog broja ljudi u bilo kom trenutku zadatog intervala (p_start, p_end)
Prohvaticu dizajn tabele ovakav kakav jeste, uz jednu dopunu: Zakazivanje je an svakih 15 miuta. ne mozete zakazati ud 1:43PM do 5:27PM, ali moze 1:45PM do 5:30PM. ovo nece uticati na opstost resenja, ali ce biti lakse da se shvati.
Onda cu da u igru uvedem tabelu koju sam nazvao DanPo15Minuta. tabela ima dve kolone: (Od,Do) i obe su DateTime tipa. Tabela ima 24*4 = 96, redova, po jedan za svakih 15 minuta u danu. Ovako pocinje:
Od Do
12:00:00 AM 12:15:00 AM
12:15:00 AM 12:30:00 AM
12:30:00 AM 12:45:00 AM
12:45:00 AM 1:00:00 AM
1:00:00 AM 1:15:00 AM
1:15:00 AM 1:30:00 AM
1:30:00 AM 1:45:00 AM
1:45:00 AM 2:00:00 AM
2:00:00 AM 2:15:00 AM
a ovako zavrsava:
Od Do
10:30:00 PM 10:45:00 PM
10:45:00 PM 11:00:00 PM
11:00:00 PM 11:15:00 PM
11:15:00 PM 11:30:00 PM
11:30:00 PM 11:45:00 PM
11:45:00 PM 12:00:00 PM
Onda cu tabelu vip_restoran da "explodiram", tako sto cu za svaki interval (strt_time, end_time) da prikazem sve cetvrtine sata (15 min) koji pripadaju tom intervalu. Interval od 2pm do 6pm prikazao bi se ovako:
vip_cutomer_id start_time Od Do end_time broj_musterija_koje_customer_dovodi
63 2:00:00 PM 3:15:00 PM 3:30:00 PM 6:00:00 PM 130
63 2:00:00 PM 2:00:00 PM 2:15:00 PM 6:00:00 PM 130
63 2:00:00 PM 2:15:00 PM 2:30:00 PM 6:00:00 PM 130
63 2:00:00 PM 2:30:00 PM 2:45:00 PM 6:00:00 PM 130
63 2:00:00 PM 3:00:00 PM 3:15:00 PM 6:00:00 PM 130
63 2:00:00 PM 5:45:00 PM 6:00:00 PM 6:00:00 PM 130
63 2:00:00 PM 3:30:00 PM 3:45:00 PM 6:00:00 PM 130
63 2:00:00 PM 3:45:00 PM 4:00:00 PM 6:00:00 PM 130
63 2:00:00 PM 5:00:00 PM 5:15:00 PM 6:00:00 PM 130
63 2:00:00 PM 5:30:00 PM 5:45:00 PM 6:00:00 PM 130
63 2:00:00 PM 2:45:00 PM 3:00:00 PM 6:00:00 PM 130
63 2:00:00 PM 5:15:00 PM 5:30:00 PM 6:00:00 PM 130
63 2:00:00 PM 4:45:00 PM 5:00:00 PM 6:00:00 PM 130
63 2:00:00 PM 4:30:00 PM 4:45:00 PM 6:00:00 PM 130
63 2:00:00 PM 4:15:00 PM 4:30:00 PM 6:00:00 PM 130
63 2:00:00 PM 4:00:00 PM 4:15:00 PM 6:00:00 PM 130
Ako ovako uradim za sve zadate intervale, mogu da uradim
GROUP BY Od, Do, SUM(broj_musterija_koje_customer_dovodi)
i to ce mo dati za svaki interval od 15 minuta koliko ljudi ima u restoranu.
Kveri koji pokazuje ukupan broj ljudi po intervalu od 15 minuta izgleda ovako (Access, ali mislim da ce raditi svuda):
CREATE VIEW vip_restoran_exp
AS
SELECT
DanPo15Minuta.Od
, DanPo15Minuta.Do
, Sum(vip_restoran.broj_musterija_koje_customer_dovodi) AS SumOfbroj_musterija_koje_customer_dovodi
FROM vip_restoran, DanPo15Minuta
WHERE (((DanPo15Minuta.Od)>=[start_time]) AND ((DanPo15Minuta.Do)<=[end_time]))
GROUP BY DanPo15Minuta.Od, DanPo15Minuta.Do;
Onda kreiram jos jednu pomocnu tabelu,
vip_to_test, gde cu da drzim parametre. Identicna struktura kao vip_restoran, i samo jedna red dozvoljen. Unesem moje parametre pa onda tu tabelu takodje explodiram, na slican nacin:
CREATE VIEW vip_to_test_exp
AS
SELECT vip_to_test.Id, vip_to_test.vip_cutomer_id, vip_to_test.start_time, DanPo15Minuta.Od, DanPo15Minuta.Do, vip_to_test.end_time, vip_to_test.broj_musterija_koje_customer_dovodi
FROM vip_to_test, DanPo15Minuta
WHERE (((DanPo15Minuta.Od)>=[start_time]) AND ((DanPo15Minuta.Do)<=[end_time]));
Ovde mi ne treba GROUP BY posto imam tacno jedan red u tabeli vip_to_test.
Sada ova dva view-a JOINujem po paru (Od,Do) ovako:
SELECT
vip_restoran_exp.Od
, vip_restoran_exp.Do
, vip_restoran_exp.SumOfbroj_musterija_koje_customer_dovodi
, vip_to_test_exp.broj_musterija_koje_customer_dovodi
, [SumOfbroj_musterija_koje_customer_dovodi]+[broj_musterija_koje_customer_dovodi] AS Total
FROM vip_restoran_exp
INNER JOIN vip_to_test_exp
ON (vip_restoran_exp.Do = vip_to_test_exp.Do)
AND (vip_restoran_exp.Od = vip_to_test_exp.Od);
Ovaj SELECT mozeet da upotrebite da vidite da li ce dodavanje nove grupe premasiti dozvoljeni broj posetilaca.
Ako vam se interval od 15 minuta cini nedovoljno finim, napravite tabelu koja sadrzi svaki minut u danu, ili svaku sekundu cak i dbicete sta vam treba.
Komentar na datu tabelu vp_restoran: iz dizajna tabele sledi da se posete zakazuju u jednom danu, i da se restoran zatvara najkasnije u ponoc, 24:00.
Ako bi u igru uveli i datumski deo timestampa, kveriji bi se donekle zakomplikovali i to je sve. Ako uvedete cele datume u igru, mozete ovo resenje da primenite na hotele i rezervacije soba, sa pomocnom tabelom koja sadrzi sve dane u narednih 50 godina na primer.
Zakacio sam Access fajl, gde se vide kveriji i primer. Zavrsni kveri je vip_to_test_exp_show_total, a on se dobija od vip_restoran_exp i vip_to_test_exp. A njih dva smo objasnili u tekstu.

Postoji i kveri vip_restoran_exp_long, koji je samo demonstracija da se lakse shvati proces "exsplodiranja" vremenskih intervala.
Toliko od mene. Sigurno moze i elegantnije, ali je meni ovo najlakse da pratim i da objasnim.