Tervehdys.
Minulla on sivulla checkboxeja, joista voi ruksia yhden näistä:
1 päivä 2 päivää 3 päivää 4 päivää 1 viikkoa 2 viikkoa 1 kuukausi 2 kuukautta 5 kuukautta
Minulla on tietokannan taulussa päivämäärä-kenttä, joka on muotoa:
2009-04-14 15:05:52
Jos käyttäjä nyt valitsisi 2 päivää, niin tietokannan taulusta haettaisiin kaikki data, jonka aikakenttä on tätäpäivää tai eilistä.
Eli kaikki data, joissa on päivämäärä 2009-04-14 ja 2009-04-13
Jos suoritan haun tällätavalla
SELECT * FROM taulu WHERE aika >= DATE_SUB(NOW(), INTERVAL 2 DAY) AND aika <= NOW();
Tulee tauluista tiedot, jotka ovat ajalla NYT - 48 tuntia.
Mutta miten saisin tehtyä sellaisen kyselyn, joka ottaisi vain ne tiedot, joissa aikakolumnissa on tämänpäivän + eilisen päivämäärä ?
Ja jos käyttäjä valitsee 2 viikkoa, pitäisi taulusta saada kaikki data, missä päivämääränä on 2009-04-01 - 2009-04-14
jne...
Osaisiko joku auttaa ?
Tein pikaseen tämmösen testin. Voi olla paljon parempiakin tapoja toteuttaa tämä, mutta tämä toimii ainakin kutakuinkin siihen suuntaan mitä halusit. Saattaa mennä väärin mm. siinä jos antaa ajaksi 60 päivää (2kk) makeOffsetille() ja kuukausissa on eri määrä päiviä, niin voi tulla liikaa/liian vähän tuloksia päivän parin heitolla. Mutta siitä vain soveltaan lisää sitten omiin tarpeisiin sopivaksi.
<?php function makeOffset($days) { $secondsPerDay = 86400; // 24h * 60m * 60s $interval = $secondsPerDay * $days; $offset = date('Y-m-d', time() - $interval); return $offset . ' 00:00:00'; // Lisätään tunnit yms. perään, jotta formaatti on oikea mysql kyselylle } $today = date('Y-m-d') . ' 24:00:00'; $offset = makeOffset(1); // hakee tämän ja eilisen päivän tiedot // $offset = makeOffset(7); // hakisi tämän päivän + 7 edellisen päivän tiedot $query = "SELECT * FROM testi WHERE paivays <= '$today' AND paivays >= '$offset'"; ?>
mrkebab kirjoitti:
Jos suoritan haun tällätavalla
SELECT * FROM taulu WHERE aika >= DATE_SUB(NOW(), INTERVAL 2 DAY) AND aika <= NOW();Tulee tauluista tiedot, jotka ovat ajalla NYT - 48 tuntia.
Mutta miten saisin tehtyä sellaisen kyselyn, joka ottaisi vain ne tiedot, joissa aikakolumnissa on tämänpäivän + eilisen päivämäärä ?
Vaikka tälleen:
SELECT * FROM taulu WHERE aika >= DATE_SUB(FLOOR(NOW()), INTERVAL 1 DAY) AND aika <= NOW();
Floor pyöristää alaspäin lähimpään kokonaislukuun (tai Datetime tapauksessa alaspäin lähimpään kokonaiseen päivään, eli kellonaikaan 0:00)
Jesh.. eli noinhan se tapahtuukin kätevästi :) En tiennytkään, että tuo FLOOR() toimii myös tuossa päivämäärän kanssa(?) Eli ymmärsinkö oikein, että tuo FLOOR muuttaa sen NOW päivämäärän esim. 2009-04-14 12:43:12 muotoon -> 2009-04-14 00:00:00, josta sitten vähennetään haluttu määrä päiviä?
Kiitos paljon avusta TenDoLLa ja Grez !
Aihe on jo aika vanha, joten et voi enää vastata siihen.