Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

SQL mozgalica - Kalendar.

[es] :: Baze podataka :: SQL mozgalica - Kalendar.

[ Pregleda: 5136 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.adsl-1.sezampro.yu.



Profil

icon SQL mozgalica - Kalendar.18.12.2007. u 00:47 - pre 198 meseci
Pozdrav,

inspirisan temom u forumu ya Firebird, a vezano za datume, došao sam na ideju da pokrenem rešenje sledećeg problema. Naime, ideja je da se napravi kalendar za tekući mesec koji bi trebao imati sedam kolona i (najčešće) pet redova. Slika predstavlja dobijeno rešenje za mesec jun 2007. godine (PostgreSQL):



Bilo bi lepo da rešenje predstavite u drugim sistemima za baze podataka, a potom ću predstaviti rešenje u PostgreSQL -u, njega jedino imam instaliranog, ukoliko to niko ne predstavi. Napomenuću, a možda nekom i pomogne, da sam u PostgreSQL -u koristio funkciju GENERATE_SERIES.
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: SQL mozgalica - Kalendar.19.12.2007. u 05:40 - pre 198 meseci
Rešenje ovog problema je dao Anthony Molinaro u svojoj knjizi "SQL Cookbook". Data su specifična rešenja za DB2, Oracle, PostgreSQL, MySQL i SQL Server.

Nisam siguran da li smem da postavim to rešenje da ne bih kršio autorska prava :) Ja svoje rešenje nemam, jer se jednostavno ne bi razlikovalo od Anthonyjevog.

[Ovu poruku je menjao chachka dana 20.12.2007. u 01:18 GMT+1]
"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: SQL mozgalica - Kalendar.21.12.2007. u 21:37 - pre 198 meseci
Bez obzira sto je Molinaro dao resenje u svojoj knjizi, trebalo bi da se pozabavimo ovim problemom. Sam Chachka je nedavno pokazao da je moguce napravit resenje bolje od Molinarovog :-)

Nezgodnoje vreme z ovakve stvari, praznici, ne radi se i tako... Vraticu se ovoj temi verovatno posle Nove godine.

:-)
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.adsl-4.sezampro.yu.



Profil

icon Re: SQL mozgalica - Kalendar.22.12.2007. u 10:10 - pre 198 meseci
Želim prvo da se izvinem svim zainteresovanim ljudima za rešenje ovog problema, jer zaista, kraj godine, te nikako ne stižem odgovoriti, odnosno predstaviti rešenje. Rešenje koje imam je sa vežbi iz predmeta baze podataka, asistentova mozgalica, al ne mogu reći da nije identično rešenju iz pomenute knjige, još uvek ne znam, znaću kad knjigu nabavim.
Someone's sitting in the shade today because someone planted a tree a long time ago.
 
Odgovor na temu

CandyMan

Član broj: 3420
Poruke: 147



+49 Profil

icon Re: SQL mozgalica - Kalendar.24.12.2007. u 10:18 - pre 198 meseci
Zdravo svima!

Evo Oracle-ovskog sajta na kojem sam jednom davno našao par rešenja.

http://www.geocities.com/oranails/

Naravno jedna od tema je kalendar view

Code:
create or replace view calendar
as select 
month Month,
to_char(first_day, 'ww') Week,
decode(trunc(first_day,   'mm'), month, to_char(first_day,   'dd'), null) Day_1, 
decode(trunc(first_day+1, 'mm'), month, to_char(first_day+1, 'dd'), null) Day_2,
decode(trunc(first_day+2, 'mm'), month, to_char(first_day+2, 'dd'), null) Day_3, 
decode(trunc(first_day+3, 'mm'), month, to_char(first_day+3, 'dd'), null) Day_4, 
decode(trunc(first_day+4, 'mm'), month, to_char(first_day+4, 'dd'), null) Day_5, 
decode(trunc(first_day+5, 'mm'), month, to_char(first_day+5, 'dd'), null) Day_6, 
decode(trunc(first_day+6, 'mm'), month, to_char(first_day+6, 'dd'), null) Day_7
from
(
select trunc(month+(week-1)*7, 'd') first_day, month, week 
from
  (select rownum week from all_objects where rownum <=6),
  (select add_months(trunc(sysdate, 'mm'), rownum-12*100) month from all_objects)
order by month, week
)
where trunc(month, 'mm') between trunc(first_day, 'mm') and trunc(first_day+6, 'mm')


Više detalja pogledajte na http://www.geocities.com/oranails/plsql/calendar.htm

Još jedan "dragulj" sa Oranails-a je i upit za pronalaženje "rupa" u kolonama sa rednim brojevima
http://www.geocities.com/oranails/plsql/holefinder.htm

Sve najbolje u novoj godini i lepo se provedite tokom praznika!

Pozdrav iz Vršca
Nisam ni znao da znam dok nisam prob'o!
 
Odgovor na temu

srki
Srdjan Mitrovic
Auckland, N.Z.

Član broj: 2237
Poruke: 3654
*.xdsl.xnet.co.nz.



+3 Profil

icon Re: SQL mozgalica - Kalendar.24.12.2007. u 12:14 - pre 198 meseci
Citat:
CandyMan
Još jedan "dragulj" sa Oranails-a je i upit za pronalaženje "rupa" u kolonama sa rednim brojevima
http://www.geocities.com/oranails/plsql/holefinder.htm

Ovo resenje je mnogo zastarelo i ne koristi mnoge pogodnosti analitickih funkcija a posto je ovo programerski forum koji bi trebalo da poducava ljude best practices onda cu da ostavim moderniji query. Ovaj query sam vec ostavio u jednoj drugoj temi a radi mnogo brze od ovog resenja na tom sajtu:
Code:

SELECT * 
FROM  (SELECT id+1 AS "Nedostaju Brojevi OD",
              LEAD(id-1) OVER (ORDER BY id) AS "Nedostaju Brojevi Do"
       FROM temp)
WHERE "Nedostaju Brojevi OD" <= "Nedostaju Brojevi Do"


[Ovu poruku je menjao srki dana 24.12.2007. u 13:42 GMT+1]
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.adsl-4.sezampro.yu.



Profil

icon Re: SQL mozgalica - Kalendar.24.12.2007. u 22:08 - pre 198 meseci
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.
Prikačeni fajlovi
 
Odgovor na temu

chachka
Srđan Mijatov
Programer
BUS Computers
Kikinda

Član broj: 53780
Poruke: 576
*.ADSL.neobee.net.

Sajt: www.baze-podataka.net


+4 Profil

icon Re: SQL mozgalica - Kalendar.24.12.2007. u 23:56 - pre 198 meseci
A evo i ispravke koja 31. Decembar stavlja tamo gde mu je mesto:
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,
        case when (to_char(cast(date_trunc('month', current_date) as date) + x.id, 'iw') = '01')
                  and
                  cast(date_trunc('month', current_date) as date) + x.id > 20
             then '53'
             else to_char(cast(date_trunc('month', current_date) as date) + x.id, 'iw')
        end 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

"The best code is no code at all."
- Zidar (ES član)
"Biggest obstacle to learning
SQL is unlearning procedural
programming."
- Joe
Celko
"Minimize code, maximize data."
- A. Neil Pappalardo
 
Odgovor na temu

[es] :: Baze podataka :: SQL mozgalica - Kalendar.

[ Pregleda: 5136 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.