[ bloker @ 08.07.2019. 11:16 ] @
Pozdrav,

Kreirao sam aplikaciju za rezervaciju događaja i u bazi, pored ostalih polja, imam i datum rezervacije..
Potreban mi je izvještaj slobodnih datuma za određeni dan u sedmici (ponedeljak, utorak...) za određeni period.
Tj. za uneseni period od 01.06.2019. do 30.06.2019. i odabran dan Subota bi recimo trebalo da dobijem da su mi slobodni 15.06.2019 i 22.06.2019, dok su mi 1. 8. i 29. zauzeti..

Imam dvije ideje za rješavanje ovog problema, ali ni jedna mi nije "elegantna"
1. ideja:
Da kreiram tabelu "kalendar" sa poljima "datum" i "dan" i da tu unesem sve datume za narednih 10-20 godina i svakom datumu da dodam koji je dan u sedmici (1-ponedeljak, 2-utorak, .. )
I prilikom pretrage da selektujem sve datume za određeni period koji padaju u selektovan dan i onda ti datumi NOT IN u tabeli "dogadjaji"

2. ideja:
da kreiram for petlju za odabrani period i da idem jedan po jedan dan i provjeravam da li je taj dan recimo "subota" i ako jeste onda provjerava da li postoji nešto sa tim datumom već rezervisano..


Mislim da će prva ideja dosta brže raditi, ali morao bih onda da popunim tabelu kalendar sa bar 10 godina unaprijed..


Najbolje rješenje bi bilo kada bih mogao u jednom upitu da dobijem sve "rupe" u tabeli "dogadjaji" za određeni period i selektovan "dan"

Hvala unaprijed.
[ Deunan @ 08.07.2019. 11:55 ] @
Mozes da izvuces sve zauzete termine za neki dan u tom periodu, pa ih u kalendaru ugasi:
Code:

SELECT termin, DAYOFWEEK(termin) as dan FROM termini WHERE (termin BETWEEN '2019-01-30' AND '2019-09-29') HAVING dan = 6

U mysql-u datum pocinje od nedelje (1). 6 je, recimo, petak.




[Ovu poruku je menjao Deunan dana 08.07.2019. u 13:15 GMT+1]
[ bloker @ 08.07.2019. 13:57 ] @
Ok, ovim upitom mogu da dobijem sve subote koje su zauzete u 6. mjesecu..

Code:
SELECT * FROM dogadjaji WHERE datum>="2019-06-01" AND datum<="2019-06-30" AND DAYOFWEEK(datum)=7


Da li postoji način da bez kreiranja dodatne tabele sa svim datumima i danima u mjesecu dobijem slobodne datume?
Tj. samo na osnovu ove tabele "dogadjaji" da dobijem informaciju o slobodnim terminima?
[ Deunan @ 08.07.2019. 14:52 ] @
Samo ovako nesto:
Code:

select a.datum
from (
    select curdate() - INTERVAL (a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a) ) DAY  as datum
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d
) a LEFT JOIN dogadjaji ON a.datum = dogadjaji.datum
where a.datum between '2019-06-01' and '2019-06-24' and DAYOFWEEK(a.datum)=7 and dogadjaji.datum IS NULL


Nije bas "elegantno", ali radi...

[ jablan @ 11.07.2019. 11:19 ] @
@bloker: Prva ideja ti je bila dobra, to je standardno rešenje za mnoge datumske probleme. Datum tabela i to je to.
[ bloker @ 12.07.2019. 13:55 ] @
@jablan
Tako sam na kraju i odradio, mislio sam da mysql ima neko elegantnije rješenje bez kreiranja dodatne tabele sa datumima..

@Deunan
Našao sam i ja ovaj upit negdje na internetu, ali iskreno bio mi je nešto komplikovan nisam uspio da skontam kako radi.. tako da sam se vratio prvoj opciji..

Hvala svima na pomoći