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

Provera preklapanja date range-ova

[es] :: MySQL :: Provera preklapanja date range-ova

[ Pregleda: 1089 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Provera preklapanja date range-ova22.02.2013. u 09:36 - pre 135 meseci

Imam jedan naizgled banalan problem, medjutim ne znam kako da se to realizuje na MySQL-u.

Situacija je sledeca:
Tabela: Contracts (relevantne kolone: id, start_date, end_date, account_id)
Tabela: Accounts (relevantne kolone: id)
Tabela: AccountHanlders (relevantne kolone: account_id, user_id, start_date, end_date)
Tabela: Users (relevantne kolone: id)

Tabela Contracts su razni projekti u kojima se referencira Account (Client) i sveki projekat ima start i end date.
Tabela Accounts su kompanije (klijenti)
Tabela AccountHandlers su record-i koji definisu intervale "handlovanja" klijenta od strane odredjenog user-a.

Neophodno je da za svako trajanje projekta postoji barem jedan record AccountHanlders (tj. bar 1 user) da pokriva minimum interval trajanja projekta za Account za koji je on/ona zaduzeni.
Obicno su user-i dodoljeni na godisnjem nivou (ali moze i krace) da vode racuna o nekom client-u (account), pri cemu obicno ima 2 user-a koji brinu o svakom klijentu (account-u).

Cilj je utvrditi da li postoji bar jedan dan Contract-a (projekta) za neki Account, a da nije pokriven bar jednim user-om (account handlerom).

Ono sto smo mi krenuli da radimo jeste da se napravi "neka" temp tabela koja ce ubacivati date sequence, tj. da se "expand"-uje contract start_date - end_date u toliko record-a koliko ima date range; isto to da se uradi sa AccountHandler range-om i da se uradi left outer join sa date condition (contract_date = handler_date):
Account_id, Contract_id, contract_date, user_id, handler_date

Na kraju bi trebali da izolujemo slucajeve: Account_id, Contract_id, contract_date, user_id = null, handler_date = null
tj. sve one Contract-e koji imaju date (jedan dan) koji nije "pokriven" sa handler-om.

E sad, mi smo se zakucali jer ne mozemo u MySQL da zovemo stored procedure iz stored procedure.

Da li ovom problemu pomaze jedino koriscenje kursora ili ima neko elegantnije resenje?

Hvala unapred,
Igor
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Provera preklapanja date range-ova22.02.2013. u 09:59 - pre 135 meseci
Možda je bolje ovo da se ne reši SQL upitom nego na aplikacionom nivou. Međutim, ako je neophodno da se reši upitom, da li bi ti radila posao dodatna tabela koja bi bila napunjena samo datumima, recimo tabela test_calendar sa samo jednim datumskim poljem test_date, a u toj tabeli svi datumi u opsegu koji je potreban (kako u prošlosti, tako i u budućnosti)?

Code (sql):

SELECT contracts.id, test_calendar.test_date
FROM contracts, test_calendar
WHERE test_calendar.test_date BETWEEN contracts.start_date AND contracts.end_date
  AND NOT EXISTS (SELECT 1 FROM AccountHanlders, Accounts
                       WHERE AccountHanlders.account_id = Accounts.id
                       AND Accounts.id = Contracts.account_id
                       AND test_calendar.test_date BETWEEN AccountHanlders.start_date AND AccountHanlders.end_date)
 


Napomena: upit nisam testirao, jer mi nisi dao cretate table komande za tvoje tabele, tako da ne garantujem da je upit bez grešaka, ali pretpostavljam da razumeš ideju.
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Provera preklapanja date range-ova23.02.2013. u 17:55 - pre 135 meseci
aj lepo
- daj create sviha tebela
- daj neke inserte koji ce popuniti neku dummy datu u te tabele
- daj sta hoces da ti bude rezultat
- daj sta si ti do sada probao pa ti nije radilo

ovako nema smisla da mi nagadjamo i pretpostavljamo - tebi je logicno jer gledas u to danima, mi gledamo u neke druge stvari te nam tvoj koncept nije logican te ga objasni detaljno (tako sto das skript koji izvrsimo i imamo datu sa kojom onda mozemo da probamo sta si trazio)
 
Odgovor na temu

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Re: Provera preklapanja date range-ova25.02.2013. u 08:47 - pre 135 meseci

Hvala na brzim odgovorima.

@djoka_l: Nisam stigao jos da isprobam, ali predlog mi deluje odlicno.

@bogdan.kecman: Problem sam ovde uprostio, jer je stvarno stanje baze prilicno komplikovano, ali se svodi na opisan problem provera range-ova. Ako mi ne bude odgovaralo resenje od djoka_l, napisacu u vise detalja (e.g. create, insert, resultat)

Hvala,
Igor
 
Odgovor na temu

igor.vitorac

Član broj: 144858
Poruke: 483



+13 Profil

icon Re: Provera preklapanja date range-ova28.02.2013. u 16:36 - pre 135 meseci
Citat:
djoka_l:
Možda je bolje ovo da se ne reši SQL upitom nego na aplikacionom nivou. Međutim, ako je neophodno da se reši upitom, da li bi ti radila posao dodatna tabela koja bi bila napunjena samo datumima, recimo tabela test_calendar sa samo jednim datumskim poljem test_date, a u toj tabeli svi datumi u opsegu koji je potreban (kako u prošlosti, tako i u budućnosti)?

Code (sql):

SELECT contracts.id, test_calendar.test_date
FROM contracts, test_calendar
WHERE test_calendar.test_date BETWEEN contracts.start_date AND contracts.end_date
  AND NOT EXISTS (SELECT 1 FROM AccountHanlders, Accounts
                       WHERE AccountHanlders.account_id = Accounts.id
                       AND Accounts.id = Contracts.account_id
                       AND test_calendar.test_date BETWEEN AccountHanlders.start_date AND AccountHanlders.end_date)
 


Napomena: upit nisam testirao, jer mi nisi dao cretate table komande za tvoje tabele, tako da ne garantujem da je upit bez grešaka, ali pretpostavljam da razumeš ideju.



Hvala. Radi k'o ludo. :-)
Vec sam pomislio da cemo morati da se petljamo sa kursorima.
Btw, vec imam helper calendar tabelu, tako da se sve odlicno uklopilo.

Hvala,
Igor
 
Odgovor na temu

[es] :: MySQL :: Provera preklapanja date range-ova

[ Pregleda: 1089 | Odgovora: 4 ] > FB > Twit

Postavi temu Odgovori

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