Autor | Zpráva | ||
---|---|---|---|
Tirus Profil |
#1 · Zasláno: 27. 5. 2011, 21:49:21
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 |
#2 · Zasláno: 27. 5. 2011, 22:10:35
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 |
#3 · Zasláno: 27. 5. 2011, 22:17:55
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 |
#4 · Zasláno: 27. 5. 2011, 22:33:00
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 |
#5 · Zasláno: 27. 5. 2011, 22:43:49
Tirus:
V MySQL (a skoro žádném jazyce, který jsem potkal) nemůžeš psát nerovnosti za sebou: SELECT 2 < 2 < 2 |
||
Časová prodleva: 4 dny
|
|||
Tirus Profil |
#6 · Zasláno: 31. 5. 2011, 20:44:51 · Upravil/a: Tirus
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'] . '))' |
||
Časová prodleva: 13 let
|
0