Query - Tijd + 100 minuten
columns
datum, tijd, thuis, uit, uitslag
d-m-Y, 00:00, teamnaam, teamnaam, 0-0
bv, 09-08-2014, 12:30, teamnaam, teamnaam, 3-3
Nu wil ik met ene query ervoor zorgen dat ik alleen de records laat zien, welke op de betreffende dag zijn en vanaf de tijd dat de wedstrijd begint, tot 100 minuten erna (Zodat ik 5 voor het einde van de wedstrijd de Man of the Match weet)
Nu heb ik deze query, waarmee ik al wel de wedstrijden van vandaag alleen te zien krijg:
Code (php)
1
2
2
$vandaag = date("d-m-Y");
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE datum = '".$vandaag."'");
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE datum = '".$vandaag."'");
Maar nu wil ik de query dus aanpassen zodat alleen de wedstrijden van vandaag, plus die op dit moment gespeeld worden te zien krijg. Een wedstrijd duurt incl rust zon 105 minuten.
Ik dacht dat als volgt te doen
Code (php)
1
$query = mysql_query("SELECT * FROM `wedstrijden".$jaar."` WHERE datum = '".$vandaag."' AND tijd > DATE_SUB(now(), interval 100 minute)");
Maar dit werkt niet. Iemand een idee? Of in welke richting ik moet zoeken? Of klinkt mijn verhaal helemaal niet logisch?
EDIT:
Hm, als ik mn datum veld wijzig naar een waarde als bv 2014-08-04 15:00:00 dan kan ik wel van een afgeleide van bovenstaande query gebruik maken. Dan werkt bv wel:
Code (php)
1
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE datum > DATE_SUB(now(), interval 100 minute)");
Als iemand een oplossing heeft voor mn eerste variant zou mooi zijn, anders zal ik alle gegevens opnieuw moeten invoeren..
Gewijzigd op 04/08/2014 17:06:20 door Bart B
Bart B op 04/08/2014 16:58:33:
datum, tijd, thuis, uit, uitslag
d-m-Y, 00:00, teamnaam, teamnaam, 0-0
bv, 09-08-2014, 12:30, teamnaam, teamnaam, 3-3
d-m-Y, 00:00, teamnaam, teamnaam, 0-0
bv, 09-08-2014, 12:30, teamnaam, teamnaam, 3-3
Je start is al fout.
Gebruik voor een datum altijd een DATE type en voor datum/tijd DATETIME.
Het is niet zoveel werk als je denkt:
Voeg een kolom toe aan de tabel van datetime datatype en noem hem datum_tijd.
Dan deze query:
Code (php)
1
2
3
2
3
UPDATE wedstrijden
SET
datum_tijd = STR_TO_DATE(datum, '%d-%m-%Y') + INTERVAL tijd HOUR_SECOND
SET
datum_tijd = STR_TO_DATE(datum, '%d-%m-%Y') + INTERVAL tijd HOUR_SECOND
Gewijzigd op 04/08/2014 17:24:04 door Ger van Steenderen
Code (php)
1
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE datum > DATE_SUB(now(), interval 100 minute)");
Dan krijg ik gewoon alle wedstrijden te zien. Ook bv die aankomende zaterdag worden gespeeld. En niet alleen waarvan de aanvangstijd minder dan 100 minuten geleden is.
Ik heb bv voor vandaag 2 wedstrijden staan, waarin het DATETIME field dan 2014-08-04 18:00:00 en 2014-08-04 20:30:00 staan. Dan zou ik alleen de wedstrijd van 2014-08-04 18:00:00 moeten zien, omdat deze minder dan 100 minuten geleden gestart is. Die van 2014-08-04 20:30:00 zou ik niet moeten zien omdat deze nog niet begonnen is. Nog een idee hoe ik dat zou moeten doen, of in welke richting ik de query zou moeten formuleren?
Wat je wilt hebben is de wedstrijden waarvan de aanvangstijd tussen nu en nu-100 minuten ligt, in de query krijg je dan
Niet getest.
WHERE NOW() >= DATE_SUB(datum, INTERVAL 100 MINUTE)
Dan keer je het om, je krijgt dan ook de wedstrijden van gisteren.
Mis ik iets?
Ik zit ondertussen ook even wat anders te testen, maar onderstaande geeft 0 rows
en dit onderstaande geeft ze wel van vandaag terug.
Code (php)
1
2
2
$vandaag = date("Y-m-d");
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE DATE(datum) = '$vandaag%'");
$query = mysql_query("SELECT * FROM `wedstrijden` WHERE DATE(datum) = '$vandaag%'");
Kan iemand me dit uitleggen hoe dat komt?
Gewijzigd op 04/08/2014 19:10:20 door Bart B
Ger van Steenderen op 04/08/2014 18:35:28:
Dit gaat niet werken. Bij between moet je de laagste waarde als eerste noemen, dus:
WHERE datum BETWEEN NOW() - INTERVAL 100 MINUTE and NOW()
Pardon?
Dus 7 ligt wel tussen 5 en 10 maar niet tussen 10 en 5?
Toevoeging op 04/08/2014 19:33:47:
Inderdaad ....
Willem vp op 04/08/2014 19:23:26:
Ah super, dank je wel. Zo werkt het zoals het zou moeten werken. Nogmaals dank allemaal!
Gewijzigd op 04/08/2014 19:37:00 door Bart B
Ger van Steenderen op 04/08/2014 19:31:11:
Dus 7 ligt wel tussen 5 en 10 maar niet tussen 10 en 5?
Klopt. Als je in de source van MySQL kijkt (sql/item_cmpfunc.cc) dan zul je zien dat BETWEEN is geïmplementeerd als:
Code (php)
1
2
2
if (!args[1]->null_value && !args[2]->null_value)
return (longlong) ((value >= a && value <= b) != negated);
return (longlong) ((value >= a && value <= b) != negated);
(enigszins afhankelijk van het datatype, maar het komt allemaal op hetzelfde neer)
Ik vind het alleen niet logisch om het zo te programmeren.
Ger van Steenderen op 04/08/2014 20:50:07:
Ik vind het alleen niet logisch om het zo te programmeren.
Eerlijk gezegd: ik wel. ;-)
Wiskundig gezien is er weliswaar geen verschil, maar in het normale spraakgebruik zul je meestal ook eerst de lage waarde noemen (het wordt morgen tussen de 27 en 30 graden; er valt tussen de 2 en 4 mm regen; ik zoek een secretaresse tussen de 20 en 30 jaar; mijn nieuwe auto mag tussen de 7000 en 10000 euro kosten).
Daarnaast is het ook qua performance beter, want het scheelt toch een aantal vergelijkingen en bij een query op een dataset van een paar miljoen records zul je dat best merken.
Gewijzigd op 04/08/2014 22:04:58 door Willem vp