Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP/MySQL: ajanvarauskyselyongelma

Sivun loppuun

tino [02.11.2004 18:37:01]

#

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ää?

petterik [02.11.2004 18:57:20]

#

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.

Antti Laaksonen [02.11.2004 18:59:39]

#

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.

petterik [02.11.2004 19:14:04]

#

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

Antti Laaksonen [02.11.2004 19:38:39]

#

Tarkoitin, että kustakin henkilöstä tehdään oma taulukko PHP-skriptissä, ja taulukossa on tieto henkilöiden vapaista ajoista.

tino [03.11.2004 09:40:28]

#

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.

petterik [03.11.2004 11:22:14]

#

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";
}

tino [03.11.2004 13:23:57]

#

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ä.

ajv [03.11.2004 18:26:50]

#

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"

tino [04.11.2004 21:44:23]

#

Tämä tapaus ratkesi Antin ajatusten pohjalta. Kiitokset kaikille!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta