Records selecteren adhv datums

Status
Niet open voor verdere reacties.

bn2vs

Terugkerende gebruiker
Lid geworden
18 aug 2007
Berichten
1.705
Hey,

Ik heb een tabel met 'hits' erin en een veld dat de timestamp bevat van de hit.
Nu wil ik het volgende doen:

Code:
for datum = 7 dagen geleden to vandaag
$hitz = $db->GetNumRows("SELECT * FROM hitz WHERE timestamp > datum begin AND timestamp < datum end");
next

Hoe maak ik die loop precies? (Ik weet hoe ik loops moet maken - niet hoe ik die dagen kan afgaan)
Hoe controleer ik of die teiestamp binnen die dag valt in de SQL query?

Cheers
BN
 
Precies weet ik het zo ook niet, maar je zou in ieder geval eens kunnen kijken naar de strtotime() functie van PHP.

Daarnaast, is de manier waarop je de loop geschreven hebt in je voorbeeld niet correct hè? Een loop in PHP is anders dan in VB.

Ook zul je zo waarschijnlijk nog de reactie krijgen dat je de data beter als DATE / DATETIME kunt opslaan, maar daar weet ik verder het fijne niet van.
 
Hey, thnx

Voorbeeld is gwn pseudocode, niet in een specifieke taal geschreven.

Discussie over timestamps vs date heb ik al eens gehad -> maakt niet veel uit hoe je het opslaat, je kan immers met 1 functie van de ene naar de andere (en het verandert mn probleem totaal niet)

Cheers
BN
 
De functie die je zoekt is denk ik:
PHP:
mktime();
 
Hey, thnx
maakt niet veel uit hoe je het opslaat, je kan immers met 1 functie van de ene naar de andere

Welk argument je ook gebruikt, één ding is zeker: je slaat je data altijd inconsequent op, omdat een timestamp nou eenmaal beperkingen kent.
 
Welke beperkingen heeft die die een date niet heeft? Een timestamp bevat het moment tot op de ms nauwkeurig, dus alles wat erboven licht moet je eruit kunnen halen he. Of je nu date of timestamp gebruikt lijkt me eerder een kwestie van voorkeur.

Anyway, dit gaat over een veld met timestamps, niet dates, dus verdere discussie is redelijk off topic :)

Cheers
BN
 
Bedoel jij dat je enkel datums na jan 1 1970 kan hebben? Dat is hier zeker geen issue :p
 
Volgens mij geeft een standaard PHP timestamp geen ms. Je kunt wel microtime gebruiken, maar dan gaat ie weer tot microseconden.

Het heeft er ook mee te maken dat MySQL zelf met data kan rekenen. Je kunt aangeven dat je records tussen bepaalde data wilt hebben, of tot drie dagen geleden bijvoorbeeld.

Ik weet zo niet precies de syntax, want ik gebruik het niet vaak, maar het is echt makkelijker / efficiënter om het zo te doen.

Om toch nog even op je oorspronkelijke vraag terug te komen,

Ik denk dat je schematisch aan het volgende moet denken:

  1. Vraag de datum van vandaag op
  2. Neem de timestamp van de huidigedatum om 0:00
  3. Trek daar het aantal dagen x 86.400 van af (ondergrens) en sla op als $ondergrens
  4. Trek daar het aantal dagen - 1 x 86.400 van af (bovengrens) en sla op als $bovengrens
  5. Voer een query uit met een BETWEEN clause

dan kom je op ongeveer dit:

PHP:
$date = getdate();
$today = mktime( 0, 0, 0, $date[mon], $date[mday], $date[year] );

for ( $i = 7; $i >= 0; $i-- ){

  $ondergrens = $today - ( $i * 86400 );
  $bovengrens = $today - ( ( $i - 1 ) * 86400 );

  $hitz = $db->GetNumRows("SELECT * FROM hitz WHERE timestamp BETWEEN " . $ondergrens . " AND " . $bovengrens);


}

Ik denk iets in die trand.
 
Hey,

Ik had al iets in die richting, maar jouw code is een stuk beter :)

Ik krijch echter niet de gewenste resultaten, ik krijch overal 0 records als resultaat. Als ik de timestamps controleer liggen al die gene die in mn tabel zitten boven de bovengrens van de huidige datum (huh?). Een idee hoe dit kan? (De timestamps worden opgeslaan direct met time(), dus daar licht de fout niet echt lijkt me)

Cheers
BN
 
Omg, had de lower en upper limits verwisseld >_>

Code werkt prima, thnx for the help :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan