Autor Zpráva
Tirus
Profil
Potřeboval bych poradit. snažím se sesmolit SQL dotaz, tak aby otestoval, zda se nekříží nové datumy se všema ostatníma v DB a když ano, aby to našlo určitý den a u něho porovnal, zda se nekříží časy.

jedná se o pronájmy místností. čili. nějaká skupina si pronajme místnost například od 23.4.2011 do 8.7.2011, ale bude je mít pronajmuté např. pouze ve středu a to od 17:00 do 18:30. a další skupina bude chtít od 4.6.2011 do 9.9.2011 středa, 18:00 do 19:30. tak aby mi to něco navrátilo a já dle toho neprovedu přidání.
Nevím jak lépe to popsat. Prostě abych zabránil křížení pronájmů.
TomášK
Profil
Mějme pronájmy [A,B] (od času A do času B) a [C,D]. Kříží se, pokud
* A < C < B  < D nebo
* A < C < D  < B nebo
* C < A < D  < B nebo
* C < A < B  < D.

O něco kratší zápis je rozmyslet si, kdy se nekříží:
* A < B < C < D nebo
* C < D < A < B
.

Pokud předpokládáme korektně zadané intervaly A < B a C < D, jde oba zápisy zkrátit. Ve druhém případě stačí:
B < C nebo D < A


Pro pochopení doporučuju vzít si tužku, papír a kreslit obdélníčky, rozebrat všechny případy není zas tolik práce. Některé databáze mají i konstrukci OVERLAPS, která to trochu zpřehledňuje, MySQL myslím ne.
Tirus
Profil
TomášK:
kreslit sem si to zkoušel, ovšem po chvíli se v tom ztrácím. Jinak děkuji za rozpis... zkusím si to podobně rozepsat
Tirus
Profil
TomášK:
zkusil jsem to sesmolit takto (dle tvého návrhu)
SELECT * FROM `rent_rent` WHERE  (('16:00:00' < `time_from` < '17:29:59'  < `time_to`) OR
 ('16:00:00' < `time_from` < `time_to`  < '17:29:59') OR
 (`time_from` < '16:00:00' < `time_to`  < '17:29:59') OR
 (`time_from` < '16:00:00' < '17:29:59'  < `time_to`)) AND `place_id` = 1


ovšem navrátí to vše, co je v place_id = 1
TomášK
Profil
Tirus:
V MySQL (a skoro žádném jazyce, který jsem potkal) nemůžeš psát nerovnosti za sebou:
SELECT 2 < 2 < 2
také vrátí výsledek 1 (pravda). Pravděpodobně se to vyhodnotí jako (2 < 2) < 2, část v závorkách je nepravda, ta se převede na 0 a porovná se 0 < 2, což je pravda.
Tirus
Profil
TomášK:
takže jak bych to mohl zlehčit?
Napadlo mne, že by asi lehčí bylo, kdy se to nekříží ne?
ehm, nyní jsem si všiml, že jsi to i psal :)

takže bych to mohl vzít nějak takto:
'(((' . $_SESSION['time_from'] . ' < ' . $_SESSION['time_to'] .') AND (`time_from` < `time_to`) AND (' . $_SESSION['time_to'] .  ' < `time_to`)) OR ((`time_from` < `time_to`) AND (' . $_SESSION['time_from'] . ' <' . $_SESSION['time_to'] .')) AND (`time_to` < ' . $_SESSION['time_from'] . '))'

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0