login  Naam:   Wachtwoord: 
Registreer je!
 Forum

DATEDIFF en DATE_FORMAT combineren

Offline Dark_Paul - 05/11/2006 12:00
Avatar van Dark_PaulPHP ver gevorderde Hej,

Ik wilde een query uitvoeren en daarin het verschil in minuten tussen de huidige tijd en de laatst actieve tijd van een member ophalen. Ik had gedacht om dat zo te doen, maar dat werkt niet.
  1. $qon = mysql_query("SELECT id, DATEDIFF(NOW(), last_login) AS timediff,
  2. DATE_FORMAT(timediff, '%i') AS timediff
  3. FROM members") or die(mysql_error());


Ik krijg als error terug dat het veld 'timediff' niet bestaat. Als ik de DATE_FORMAT weghaal werkt het wel..
Toen bedacht ik me om dit te doen:
  1. $qon = mysql_query("SELECT id,
  2. DATE_FORMAT(DATEDIFF(NOW(), last_login), '%i') AS timediff
  3. FROM members") or die(mysql_error());

maar dat werkt ook niet. Heeft iemand een idee hoe ik dit kan doen (het veld last_login is een DATETIME veld).

10 antwoorden

Gesponsorde links
Offline Addow - 05/11/2006 13:07
Avatar van Addow Gouden medaille

PHP beginner
Dark_Paul,

Ik gebruik meestal zo'n query:
  1. <?
  2. // qry geeft het verschil (in seconden) tussen actieve & huidige tijd terug, indien recent actief binnen 5 minuten (300 seconden)
  3. mysql_query("SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) as sec_online FROM members WHERE sec_online > 300");


Waarbij hij het aantal seconden teruggeeft, indien actief in de laatste 5 minuten. Op die manier kan je nog doen wat je wil met je uitvoer.

Wat je ook kan gebruiken (hangt van de situatie af):
  1. <?
  2. // qry geeft het verschil (??m. ??s.) tussen actieve & huidige tijd terug, indien recent actief binnen 5 minuten (300 seconden)
  3. mysql_query("SELECT id, TIME_FORMAT(TIMEDIFF(NOW(),last_online), '%im %ss') as lo FROM members WHERE TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) > 300");


Good luck!
Offline Dark_Paul - 05/11/2006 14:03
Avatar van Dark_Paul PHP ver gevorderde Ik heb nu dit:
  1. $qon = mysql_query("SELECT id, DATEDIFF(NOW(), last_login) AS timediff
  2. FROM members WHERE timediff > 900") or die(mysql_error());
en ik krijg de melding:
Unknown column 'timediff' in 'where clause'
Met die TIME_TO_SEC en TIME_FORMAT kom ik helaas ook niet veel verder.. Ik krijg nog steeds het aantal dagen terug, hoe ik de query ook maak (of ik krijg een error).
Offline Addow - 05/11/2006 14:10 (laatste wijziging 05/11/2006 14:10)
Avatar van Addow Gouden medaille

PHP beginner
Dark_Paul, timediff is een gereserveerd woord in MySQL, dus ge zult een iets andere variabele moeten gebruiken.

Gebruik eens exact deze query:
  1. <?
  2. $qon = mysql_query("SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) as sec_online FROM members WHERE sec_online > 900") or die(mysql_error());
  3. ?>
Offline Dark_Paul - 05/11/2006 14:34 (laatste wijziging 05/11/2006 14:39)
Avatar van Dark_Paul PHP ver gevorderde De query die ik nu heb is nagenoeg hetzelfde (alleen andere namen). Ik heb ook exact jou query geprobeerd, maar ik krijg steeds:
Unknown column 'log/sec_online' in 'where clause'.
Idem in PHPMyAdmin. Zonder die 'WHERE' krijg ik wel resultaat.
Mag je geen zelf-aangemaakte velden gebruiken in je WHERE ofzo?
Edit:
Ik kan het zo oplossen:
  1. <?php
  2. include('config.inc.php');
  3. $qon = mysql_query("SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) AS log
  4. FROM members") or die(mysql_error());
  5. while ($res = mysql_fetch_array($qon)) {
  6. if ($res['log'] >= 900) {
  7. $qdel = mysql_query("DELETE FROM online WHERE memid=".$res['id']." ");
  8. }
  9. }
  10. ?>

Maar dat is niet de bedoeling..
Offline Addow - 05/11/2006 14:38 (laatste wijziging 05/11/2006 14:40)
Avatar van Addow Gouden medaille

PHP beginner
Heb jij daar nog een log/ voor geplaatst fzo? Want die vind ik niet terug in mijn eigen query 

Mijn query werkt zowel in Mysql 4.1 als 5.0, dus werkt feilloos. Ik blijf het mysterieus vinden. Je tabelstructuur is toch volledig correct.


Laatste poging:
  1. <?php
  2. include('config.inc.php');
  3. $qon = mysql_query("SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) AS log FROM members WHERE log < 900") or die(mysql_error());
  4. while ($res = mysql_fetch_array($qon)) {
  5. if ($res['log'] >= 900) {
  6. $qdel = mysql_query("DELETE FROM online WHERE memid=".$res['id']." ");
  7. }
  8. }
  9. ?>
Offline Dark_Paul - 05/11/2006 14:40 (laatste wijziging 05/11/2006 15:03)
Avatar van Dark_Paul PHP ver gevorderde Nee, ik heb niets gedaan. Ik heb letterlijk jou query gekopieerd en geplakt, en toen kreeg ik nog deze melding.
Ik snap er echt de #### niet meer van! Ik dacht dat ik 5.0 draaide, maar ik zie nu in PHPinfo() dat ik 4.1.7 draai (vreemd, want volgens mij heb ik toendertijd toch echt 5.0 geïnstalleerd).

edit: Ik update eerst even mijn MySQL, dan weet ik dadelijk zeker dat ik 5.0 heb..
Als het goed is heb ik nu echt MySQL 5.0 (ik heb 'm zojuist geïnstalleerd), maar PhpInfo() zegt nog steeds bij MySQL:
Client API version 4.1.7
Maarja, eerst even jou query proberen.
Offline Addow - 05/11/2006 14:49
Avatar van Addow Gouden medaille

PHP beginner
Hmzz, heeft uwe locale anders problemen met WHERE-clauses?

Dan proberen we de extended manier:
  1. <?
  2. $qon = mysql_query("SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) AS log FROM members WHERE TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) < 900") or die(mysql_error());
  3. ?>


Indien deze niet werkt... geef ik het op  
Offline Dark_Paul - 05/11/2006 15:06 (laatste wijziging 05/11/2006 15:45)
Avatar van Dark_Paul PHP ver gevorderde Die werkt in ieder geval. Ik ga zorgen dat ik zeker MySQL 5.0 hier draai, en dan nog een keer proberen met die WHERE log > 900.

Vage shit! Ik heb zojuist MySQL gedeïnstalleerd, en MySQL 5.0.27 geïnstalleerd (vers gedownload van mysql.com). Toch geeft PhpInfo aan dat de Client API Version 4.1.7 is. Naja, dat maakt me nog niet zoveel uit. Maar ik krijg die query met die WHERE-clausule niet werkend.

Ik heb een dump gemaakt van mijn database en die dump heb ik op mijn betaalde hosting gezet. Daar krijg ik dezelfde fout als ik die uitvoer in PHPMyAdmin, dus ik denk dat ik ergens een fout heb gemaakt bij het creeeren van mijn tabel..
Offline ikkedikke - 05/11/2006 16:59
Avatar van ikkedikke PHP expert client api gaat over de module die php heeft op de database aan te spreken, niet over de database zelf.
verder zou dit het truukje moeten doen:
SELECT id, TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) AS log FROM members WHERE TIME_TO_SEC(TIMEDIFF(NOW(), last_login)) < 900
Offline Dark_Paul - 05/11/2006 20:07
Avatar van Dark_Paul PHP ver gevorderde Dat hadden we dus En dat werkt inderdaad, maar ik vraag me af waarom WHERE log < 900 niet werkt ;)
In ieder geval bedankt!!
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.273s