Autor Zpráva
Kalby
Profil
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 *
Zkuste to takto
...AND lm.ot_do>="'.$od.'" AND lm.ot_od<="'.$do.'" 
Kalby
Profil
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 *
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
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 *
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
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

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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