Za primer sam, kao što sam naveo, koristio PostgreSQL. Funkcije koje su bile potrebne su:
*
GENERATE_SERIES
Code:
-- Generate a series of values, from start to stop with a step size of step
generate_series(start, stop, step)
*
date_trunc
Code:
date_trunc('field', source)
*
to_char
Code:
-- convert time stamp to string
to_char(timestamp, text)
-- convert interval to string
to_char(interval, text)
...
Pomoću funkcije
GENERATE_SERIES generiše se po jedan red za svaki datum u mesecu. Kao što možete uočiti na slici ispod, generišu se datumi(dy), dan iz datuma(dm), dan u nedelji koji odgovara datumu(dw), mesec za koji pravimo kalendar(mth) i nedelja u kojoj određeni datum se nalazi(wk).
Code:
select
cast(date_trunc('month', current_date) as date) + x.id as dy,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'iw') as wk,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'dd') as dm,
cast(
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'd') as integer) as dw,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'mm') as curr_mth,
to_char(current_date, 'mm') as mth
from
generate_series (0,31) x(id)
Da bi nam upit vratio samo datume meseca koji nas zanima, treba da izdvojimo redove u kojima je ispunjen uslov
curr_mth = mth - mesec kojem datum pripada treba da bude jednak mesecu tekućeg datuma. Koristeći
CASE izraz, možemo videti kojem danu u nedelji odgovara svaki dan iz kolone dm(broj dana u nedelji).
Code:
select
case dw when 2 then dm end as Mo,
case dw when 3 then dm end as Tu,
case dw when 4 then dm end as We,
case dw when 5 then dm end as Th,
case dw when 6 then dm end as Fr,
case dw when 7 then dm end as Sa,
case dw when 1 then dm end as Su
from(
select *
from(
select cast(date_trunc('month', current_date) as date) + x.id as dy,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'iw') as wk,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'dd') as dm,
cast(
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'd') as integer) as dw,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'mm') as curr_mth,
to_char(current_date, 'mm') as mth
from
generate_series (0,31) x(id)
) x
where mth = curr_mth ) y
Vrednost svakog dana u nedelji prikazana je u zasebnom redu, cilj je da dane iz iste nedelje prikažemo u jednom redu, koristeći agregatnu funkciju
MAX, te set podataka moramo grupisati po sedmicama (wk) i sortirati ih po istoj. Na kraju, svi dani iz jedne nedelje, trebali bi da se prikažu u jednom slogu (slika koju sam postavio na početku).
Code:
select
max(case dw when 2 then dm end) as Mo,
max(case dw when 3 then dm end) as Tu,
max(case dw when 4 then dm end) as We,
max(case dw when 5 then dm end) as Th,
max(case dw when 6 then dm end) as Fr,
max(case dw when 7 then dm end) as Sa,
max(case dw when 1 then dm end) as Su
from(
select *
from(
select cast(date_trunc('month', current_date) as date) + x.id as dy,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'iw') as wk,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'dd') as dm,
cast(
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'd') as integer) as dw,
to_char(
cast(date_trunc('month', current_date) as date) + x.id, 'mm') as curr_mth,
to_char(current_date, 'mm') as mth
from
generate_series (0,31) x(id)
) x
where mth = curr_mth ) y
group by wk
order by wk
Šta je interesantno na kraju, ako ste isprobali kod, uočićete jedan izuzetak, a on se odnosi na tekući mesec ove godine. Naime, rezultat koji dobijamo je:
te vidimo da se 31 izdvaja. Razlog tome je što on pripada prvoj nedelji 2008. godine, a mi vršimo grupisanje i sortiranje po nedeljama, te samim tim logičan je izuzetak.
Rešenje koje sam postavio, pošto sam dobio dotičnu knjigu, je kao u knjizi. Postavio sam ga iz razloga što moderator nije želeo obrisati mozgalicu, na moj zahtev, jer nisam znao da problem već postoji negde objašnjen(u prethodnom postu sam naveo odakle mi), nego me je zamolio da istu i dovršim do kraja. Iz poštovanja prema njemu, predstavio sam Vam rešenje na PostgreSQL -u, a ogradiću se time da je tvorac rešenja Anthony Molinaro. problem kao problem mi nije puno koristio u praksi, tj., nisam imao potrebu da pravim kalendar pomoću SQL, ali funkcije koje su predstavljene su korisne za rešenje različitih problema. Stoga, nadam se da efekat ove mozgalice se neće završiti na ovome, nego da će zainteresovanim pojedincima pomoći pri rešavanju budućih problema.
Hvala Vam na razumevanju.
[Ovu poruku je menjao Miloš Baić dana 24.12.2007. u 23:25 GMT+1]
Someone's sitting in the shade today because someone planted a tree a long time ago.