Nyt tarvitaan kiperästi apua. Olen tekemässä PHP/MySQL -parivaljakolla eräänlaista ajanvarausjärjestelmää, jossa on firman työntekijöiden menot (useita ihmisiä siis). Kannassa on jokaisen menon kohdalla mm. kentät: tyontekijaid (int), alku (datetime), loppu (datetime). Eli alku ja loppu sisältävät ajankohdat, jolloin kyseinen meno alkaa ja loppuu.
Nyt minun pitäisi saada tietää, onko jonain tiettynä päivänä jollain työntekijöistä esimerkiksi 2 tuntia vapaata kello 8 ja 16 välillä. Ja pitäisi siis tietää kyseinen/kyseiset työntekijä(t) ja ajat.
Keksiikö joku tähän jotain ratkaisua - joko MySQL-kyselyä tai PHP-pohjaista ratkaisua tai vaikka yhdistelmää?
Hyvin vapaasti pseudokielellä ilmaistuna:
SELECT * from menot,tyontekijat WHERE datevalue(alku)=datevalue(loppu) AND hour(loppu)-hour(alku)>=2 AND hour(loppu)<=16 AND hour(alku)>=8 AND datevalue(alku)="1.12.2004" AND menot.tyontekijaid=tyontekijat.tyontekijaid
En nyt ala tarkemmin ilmaisemaan itseäni jos kerran kyse on sun työtehtävästä, josta sulle maksetaan.
Pelkällä SQL:llä en osaa ratkaisua, mutta jos henkilöitä ja aikoja ei ole paljon, seuraava voisi kelvata. Ensin luetaan tietokannasta kaikki kynnelle kykenevät työntekijät. Sitten luetaan kaikki sille päivälle sijoittuvat menot. Jokaisesta henkilöstä on oma taulukko, joka on ensin täynnä vapaita aikoja. Sitten taulukosta poistetaan tietokannasta saatavat varatut ajat. Lopuksi käydään kunkin henkilön taulukko läpi, ja jos löytyy tarpeeksi pitkä yhtenäinen vapaa-aika, niin se poimitaan talteen. Jos ajat ovat vaikka 15 minuutin välein, niin taulukkoon voidaan tallentaa vapaat alkavat varttitunnit.
Antti Laaksonen kirjoitti:
Jokaisesta henkilöstä on oma taulukko,
Mitäpä tarkoitat? Ei kai jokaisella henkilöllä ole omaa taulua? Siis eikös tämä ole malliesimerkki kahden taulun välisestä liitoksesta? On yksi taulukko, jossa on menot ja tyontekijaid ja toinen taulukko jossa on tyontekijat. Sitten kun kysytään mitä tahansa tietoa niin pitää olla se liitos
SELECT * from tyontekijat,menot
WHERE tyontekijat.tyontekijaid=menot.tyontekijaid
Tarkoitin, että kustakin henkilöstä tehdään oma taulukko PHP-skriptissä, ja taulukossa on tieto henkilöiden vapaista ajoista.
Yleistiedoksi: kyllä, en hae valmista koodia ja kyseessä on työtehtävä - etsin vain ratkaisumalleja, koska itse en tällä erää keksinyt.
Mutta asiaan: tuo Antin ajatushan itseasiassa saattaisi toimia. Minäpä kokeilen tuollaista, kiitos!
Tosiaan se on käynyt aika selväksi, että SQL-kyselyllä tätä ei ilmeisimmin MySQL:ssä saa ratkaistua.
En nyt ymmärrä mistä puhutaan. Jos tiedot on relaatiotietokannassa (MySQL) kannassa niin milläs niitä muuten haet kuin MySQL:llä?
$db = mysql_connect("sejase.host.fi", "user", "salasana"); mysql_select_db("kanta",$db); $result = mysql_query("SELECT kentta1 FROM Taulu",$db); if ($myrow = mysql_fetch_array($result)) { do { $data=$myrow["kentta1"]); echo "$data"; } while ($myrow = mysql_fetch_array($result)); } else { echo "ei tietoja taulussa"; }
Tarkoitin, että ei ole olemassa MySQL-kyselyä, jolla saisi oikeat/halutut tulokset tässä tapauksessa vaan pitää parsia tuloksia PHP:llä.
Pelkistetään homma niin, että meillä olisi vain yksi ihminen. Eli ajatellaan, että on ajanvarauskanta, jossa löytyy mm. tieto tapahtuman alkuajasta ja tapahtuman loppuajasta (molemmat datetime).
Nyt pitäisi saada (mieluiten tottakai SQL:llä) selville päivästä sellaiset ajankohdat, jolloin on esimerkiksi 1 tunti vapaata.
Kertokaa toki jos keksitte tähän jonkin järkevän SQL-kyselyn, jotta välttyisi vähtäämästä liikaa PHP:llä.
tino kirjoitti:
Nyt pitäisi saada (mieluiten tottakai SQL:llä) selville päivästä sellaiset ajankohdat, jolloin on esimerkiksi 1 tunti vapaata.
Ihan hatusta vaan heitän sen enempiä koodin tarkoituksesta ymmärtämättä tämmöisen mallin, että tallentaisi sinne kantaan vapaan alkamisajankohdan (datetime) ja kuinka kauan vapaa kestää vaikka minuutteina (int).
Sillon ainakin onnistuisi tuo vapaiden hakeminen helposti(haetaan yli tunnin vapaat):
SELECT t.nimi, v.alku, v.kesto FROM vapaa-ajat v LEFT JOIN tyontekijat t ON v.henkilo_id = t.id WHERE v.kesto > 60
Tai no, saahan tuon pituuden kyllä selville helposti, vaikka nuo molemmat olisivat aikaleimoja. Olisi taas kannattanut lukea threadi alusta lähtien.
"WHERE HOUR(v.loppu) - HOUR(v.alku) > 1"
Tämä tapaus ratkesi Antin ajatusten pohjalta. Kiitokset kaikille!
Aihe on jo aika vanha, joten et voi enää vastata siihen.