Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: MySQL viimeiset x paivaa

mrkebab [14.04.2009 15:14:21]

#

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 ?

TeNDoLLA [14.04.2009 16:54:54]

#

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'";
?>

Grez [14.04.2009 19:18:51]

#

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)

TeNDoLLA [14.04.2009 19:28:30]

#

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

mrkebab [14.04.2009 21:24:46]

#

Kiitos paljon avusta TenDoLLa ja Grez !

Vastaus

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

Tietoa sivustosta