Autor | Zpráva | ||
---|---|---|---|
Kalby Profil |
#1 · Zasláno: 30. 3. 2010, 09:43:34 · Upravil/a: Moderátor (editace znemožněna) 17. 11. 2012, 23:09:37
Zdravim,
potreboval bych pomoct s jednim dotazem, mam dve tabulky, 1. ubytovaci objekt a 2. obsazeny termin. Nyni z formulare poslu odkdy dokdy bych chtel byt ubytovany, a ja bych potreboval najit vsechny objekty ktere se neprekryvaji s libovolnym obsazenym terminem (obsazenych terminu muze byt vice) Mam neco takovehoto, ale nefunguje to stoprocentne. Napriklad pokud zadam termin pred obsazenym terminem, take to nevyhleda, nebo termin mezi dvemi obsazenymi terminy to same... SELECT o.id,lm.ot_id FROM objekt AS o LEFT JOIN obsazene_terminy AS lm ON lm.ot_objekt=o.id AND lm.ot_od>="'.$od.'" AND lm.ot_do>="'.$do.'" WHERE lm.ot_id IS NULL |
||
Kajman_ Profil * |
#2 · Zasláno: 30. 3. 2010, 09:58:36
Zkuste to takto
...AND lm.ot_do>="'.$od.'" AND lm.ot_od<="'.$do.'" |
||
Kalby Profil |
#3 · Zasláno: 30. 3. 2010, 10:18:02
obavam se ze tak jednoduche to nebude :) Je to o neco lepsi, ale porad to nebere v potaz napriklad to, pokud je termin od uprostred obsazeneho terminu a termin do uz je za obsazenym terminem. nebo naopak od je pred obsazenym termin a do uvnitr...
|
||
Kajman_ Profil * |
#4 · Zasláno: 30. 3. 2010, 10:30:03
Mělo by to brát v potaz. Zkoušel jste to? Platí v db vždy, že od<=do?
Úvaha je jednoduchá - pokud nějaký termín v db končí (tedy je menší) před začátkem hledaného nebo začíná až po hledaném, tak se to do spojení nemá zahrnout - db_do<$od OR db_od>$do. Když se to zneguje, tak vyjde, že kolize najdeme díky db_do>=$od AND db_od<=$do. A tím where se vyberou ty, kde není ani jedna takováto kolize. Kdysi jsem se to snažil vysvětlit, ale tenkrát asi zřejmě marně :-) http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=69880 |
||
Kalby Profil |
#5 · Zasláno: 30. 3. 2010, 17:32:31
No zkousel jsem to, ale nefungovalo to... Teda ne pro ty pripady jak jsem uvadel. Ano vzdy plati ze od<do
LEda by byla chyba v db ale o tom pochybuju promenne od a do jsou ve formatu rrrr-mm-dd a sloupce od do v databazi jsou format DATE, takze tady asi ne. Mam dejme tomu objekt obsazene dva terminy: 2010-04-03 - 2010-04-05 2010-05-01 - 2010-05-07 Pokud zadam 2010-03-30-2010-04-04 Tak se vypise i kdyz by nemela, a kdyz to rozeberu, tak od je sice mensi ale do je take mensi takze je nulovy, proto se vypise... Takze to v tomto pripade opravdu nefunguje :) |
||
Kajman_ Profil * |
#6 · Zasláno: 30. 3. 2010, 18:49:08
V mojí db se chyba neprojevila, kolizi to najde.
select * from ( select date('2010-04-03') as ot_od, date('2010-04-05') as ot_do from dual union select date('2010-05-01') as ot_od, date('2010-05-07') as ot_do from dual ) lm where lm.ot_do>='2010-03-30' AND lm.ot_od<='2010-04-04' Doufám, že jste tu podmínku zaměnil za tu původní podobnou, ne jen přidal na konec. A pokud kolizí není stejné datum konce a začátku (např. se musí vystěhovat dopoledne a noví se mohou nastěhovat odpoledne) tam nebudou ty rovníka. |
||
Kalby Profil |
#7 · Zasláno: 30. 3. 2010, 19:26:33
Pardon jsem kus vola :) ja jsem sice prepsal mensitko za druhym andem ale uz jsem si nevsim ze jste prohodil od s do :)
Diky za ochotu |
||
Časová prodleva: 14 let
|
0