Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno kontrola křížení dat

Potřeboval bych nějak udělat kontrolu křížení. Představte si, že máte nějakou akci, která se opakuje každou středu od 20h do 21:30 od 1.11.2011 do 23.12.2011

ta bude v MySQL už uložená a já najednou budu chtít přidat nějakou akci, co bude každou středu od 18:30 do 20h od 20.9.2011 do 6.11.2011

Jak udělat to, abych zkontroloval že se to s něčím nekříží?
napadlo mne něco takovéhleho

($od_nove_cas < $do_v_db || $do_nove_cas > $od_v_db) && ($od_nove_datum < $do_v_db_datum || $do_nove_datum > $od_v_db_datum) && $den_nove_v_tydnu = $den_v_db_v_tydnu

slo by to tak, nebo má myšlenka je mimo? Jde o to, že v DB bude stovky záznamů a potřebuju jejich kontrolu

Předmět Autor Datum
Není důvod, proč by to nešlo.
Wikan 01.12.2011 10:29
Wikan
takže je to správně? seděl jsem tu nad tím včera asi 3 hodiny a následně se do toho zamotal, proto r…
tomas.kulhanek 01.12.2011 10:48
tomas.kulhanek
Máš obráceně větší a menší.
Wikan 01.12.2011 10:59
Wikan
počkej, já to mám myšleno tak, že když to něco navrátí, tak se to kříží.. právě mám myšlenou kontrol…
tomas.kulhanek 01.12.2011 11:02
tomas.kulhanek
Kříží se jestliže: !($do_nove_cas < $od_v_db || $od_nove_cas > $do_v_db) && !($do_nove_datum < $od_v…
Wikan 01.12.2011 11:39
Wikan
takže do SQL by se to dalo přepsat nějak takto? SELECT * FROM `tabulka1` where NOT('2011-11-01' <=…
tomas.kulhanek 01.12.2011 13:19
tomas.kulhanek
Tu databázi bych navrhnul obecněji. Proč ukládat 'Thursday' ? Co když někdo bude chtít se scházet tř…
hynajs 01.12.2011 13:30
hynajs
no jasně, to chápu takže dvě tabulky... v jedné je ta daná akce a v druhé jsou jejich termíny... ov…
tomas.kulhanek 01.12.2011 13:32
tomas.kulhanek
Za daného návrhu by mělo být lepší SELECT count(*) FROM `web_rent` where ('2012-11-02' <= day_to &&… poslední
hynajs 01.12.2011 14:07
hynajs
Předpoklákám, že akce s termíny budou uloženy v SQL databázi. V tom případě by byl asi nejvhodnější…
hynajs 01.12.2011 11:21
hynajs
to je to co chci... mne jde o to, zda ta má podmínka dává smysl.. včera jsem si to tu kreslil na pap…
tomas.kulhanek 01.12.2011 11:29
tomas.kulhanek

Tu databázi bych navrhnul obecněji. Proč ukládat 'Thursday' ?
Co když někdo bude chtít se scházet třeba každý třetí den ?
Ukládal bych identifikaci akce a k ní každé datum začátku, datum konce (ta se mohou lišit - co když máme rande přes půlnoc :)) ) , hodinu začátku, hodinu konce ( i ty se mohou termín od termínu u stejné akce lišit ).

no jasně, to chápu

takže dvě tabulky...
v jedné je ta daná akce
a v druhé jsou jejich termíny... ovšem v tom mám větší guláš na ten dotaz :D
nyní jsem vyřešil tento

SELECT count(*)
FROM `web_rent` where ('2012-11-02' <= day_to && '2013-01-02' >= day_from)
&& ('17:00:00' < time_to && '18:30:00' > time_from) 
&& 'Thursday' = day && place_id = 1

Za daného návrhu by mělo být lepší

SELECT count(*)
FROM `web_rent` where ('2012-11-02' <= day_to && '2013-01-02' >= day_from)
&& 
( ('17:00:00' < time_to && '17:00:00' > time_from ) || ('18:30:00' < time_to && '18:30:00' > time_from) )
&& 'Thursday' = day && place_id = 1

Spravil jsem čas : musíš otestovat, zda se navrhovaný čas ať už svým začátkem nebo koncem nestrefí mezi uložené časy ( překrytí intervalů). Takhle jen testuješ, zda se navrhovaný interval celý nevleze do už obsazeného.
Zrovna tak se dny.
Ještě nerozumím && place_id=1 ( test by asi neměl platit jen pro jednu akci).

Zpět do poradny Odpovědět na původní otázku Nahoru