Tarkoitus on saada tarkistettua meneekö uusi varaus vanhojen kanssa ristiin, sisäkkäin, päällekkäin, ym.
Tarkistuksen ylempi osa toimii, mutta alempi ei, eli uusi varaus joka jättäää olemassa olevan varauksen kokonaan sisälleen pääsee läpi, esim.
Vanha varaus: 2006-10-10 2006-10-20 Uusi varaus: 2006-10-05 2006-10-25
pääsee tarkistuksen läpi.
Varaukset tallennetaan MySQL-kantaan, päivien datatyyppinä on "date".
Varaukset tehdään XHTML lomakkeella, joka tarkistetaan PHP:n avulla.
/** * Tarkistetaan meneekö tulopäivä tai lähtöpäivä toisen varauksen sisälle **/ $varauksen_tarkistus->query("SELECT id FROM varaukset WHERE (tulopvm <= '" . $lomake['tulopvm'] . "' AND lahtopvm >= '" . $lomake['tulopvm'] . "') OR (tulopvm <= '" . $lomake['lahtopvm'] . "' AND lahtopvm >= '" . $lomake['lahtopvm'] . "')"); if ( $varauksen_tarkistus->rows() > "0" ) { $virhe['varattu'] = true; } /** * Tarkistetaan jääkö toinen varaus kokonaisuudessaan uuden sisälle **/ $varauksen_tarkistus->query("SELECT id FROM varaukset WHERE tulopvm > '" . $lomake['tulopvm'] . "' AND lahtopvm < '" . $lomake['lahtopvm'] . "'"); if ( $varauksen_tarkistus->rows() > "0" ) { $virhe['varattu'] = true; }
Kahden varauksen mahdolliset sijoitukset (C kuvaa päällekkäisyyttä):
AA BBBB ACBBB BCCB BBBCA BBBB AA
Siis uusi varaus kelpaa, jos jompikumpi ehto toteutuu:
1. Uusi lopetusaika on ennen vanhaa aloitusaikaa
2. Uusi aloitusaika on vanhan lopetusajan jälkeen
Tutki siis, onko tietokannassa varauksia, joissa kumpikaan näistä ehdoista ei toteudu.
Jos nyt oikein ymmärsin, niin kummankin ajan pitää olla joko pienempiä kuin tuloajan, tai suurempia kuin lähtöajan. Muuten ajat menevät joko ristiin jossain vaiheessa, tai sitten aika on vanhan ajan sisällä. Tälläinen tuli mieleen pikaisella pohdiskelulla (ja mikäli oikein edes ymmärsin kysymyksen).
Edit:
Anttihan tuon tiiviimmin esitti (kun oletetaan että lähtöaika ei ole koskaan ennen tuloaikaa :).
JTS: Tuo osuus jo toimikin oikein.
Ainoa mikä ei vielä toimi, on tapaus jossa uusi aika "syö" kokonaisuudessaan olemassaolevan varauksen.
Minusta minun ehtoni toimivat silloinkin:
AAAAAAA BBB AACCCAA
1. Uusi lopetusaika EI ole ennen vanhaa aloitusaikaa
2. Uusi aloitusaika EI ole vanhan lopetusajan jälkeen
Päätelmä: Ajat osuvat päällekkäin.
Samaa mieltä Antin kanssa, jos uusi aika syö vanhan ajan, niin silloin nuo Antin ehdot eivät toteudu (eivätkä kyllä omanikaan).
EDIT! Eipäs toimikaan.
Aina joku virheellinen pääsee läpi. Aargh!
Alkaa päätä kivistämään jo siihen malliin, että alennun kysymään: "SQL-lause?".
SELECT id FROM varaukset WHERE NOT (tulopvm > $lahtopvm OR lahtopvm < $tulopvm)
Ja jos tuo palauttaa rivejä, menee päällekkäin. $lahtopvm ja $tulopvm siis lomakkeen arvot, escapettuna toki.
Selvennettynä: Jos eivät ole päällekkäin, jomman kumman täytyy päättyä ennen kuin toinen alkaa. Tässä on tosiaan oletuksena että jossain tarkistetaan ettei lahtopvm voi olla ennen tulopvm:ää.
EDIT!
Upeaa. Viiden tunnin aivojen kiristely, jonka syy ei ollut lähelläkään tarkastelualuetta.
Virhe: Yksi toisaalla määritelty muuttuja ei kulkeutunut tarkistukseen asti.
Nyt kaikki ongelmakohtina olleet tarkistukset toimivat.
Ainoa mitä en onnistu estämään on tapaus, jossa useita varauksia kapseloituu yhden varauksen sisälle.
Aihe on jo aika vanha, joten et voi enää vastata siihen.