Query - Tijd + 100 minuten

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Top Low-Code Developer Gezocht!

Bedrijfsomschrijving Unieke Kansen, Uitstekende Arbeidsvoorwaarden & Inspirerend Team Wij zijn een toonaangevende, internationale organisatie die de toekomst van technologie vormgeeft door het creëren van innovatieve en baanbrekende oplossingen. Ons succes is gebaseerd op een hecht en gepassioneerd team van professionals die altijd streven naar het overtreffen van verwachtingen. Als jij deel wilt uitmaken van een dynamische, vooruitstrevende en inspirerende werkomgeving, dan is dit de perfecte kans voor jou! Functieomschrijving Als Low-Code Developer ben je een cruciaal onderdeel van ons team. Je werkt samen met collega's uit verschillende disciplines om geavanceerde applicaties te ontwikkelen en te optimaliseren met behulp van Low-code

Bekijk vacature »

Bart B

Bart B

04/08/2014 16:58:33
Quote Anchor link
Ik heb een script voor een voetbal cup geschreven waar mensen op de Man of the Match kunnen stemmen. De wedstrijden worden opgeslagen als volgt:

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
$vandaag = date("d-m-Y");
$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)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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
 
PHP hulp

PHP hulp

30/12/2024 23:23:19
 
- SanThe -

- SanThe -

04/08/2014 17:12:16
Quote Anchor link
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


Je start is al fout.
Gebruik voor een datum altijd een DATE type en voor datum/tijd DATETIME.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/08/2014 17:21:13
Quote Anchor link
Als je met datums wilt rekenen in SQL zal het datatype van de kolom altijd date of datetime moeten zijn.
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
UPDATE wedstrijden
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
 
Bart B

Bart B

04/08/2014 18:24:42
Quote Anchor link
Okee, dat is duidelijk :) Ik heb column omgezet naar een DATETIME veld en alle datums en tijden aangepast, maar als ik nu bv deze query gebruik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/08/2014 18:35:28
Quote Anchor link
Als je hetgeen je wilt weten al anders formuleert, kom je ook al een eind.
Wat je wilt hebben is de wedstrijden waarvan de aanvangstijd tussen nu en nu-100 minuten ligt, in de query krijg je dan
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT * FROM wedstrijden
WHERE
datum BETWEEN NOW() AND NOW() - INTERVAL 100 MINUTE
 
- SanThe -

- SanThe -

04/08/2014 18:36:20
Quote Anchor link
Zoiets?
Niet getest.

WHERE NOW() >= DATE_SUB(datum, INTERVAL 100 MINUTE)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/08/2014 18:53:31
Quote Anchor link
Dan keer je het om, je krijgt dan ook de wedstrijden van gisteren.
 
Bart B

Bart B

04/08/2014 19:07:18
Quote Anchor link
Ai. De BETWEEN was ik inderdaad mee aan het puzzelen. Maar deze geeft geen rows terug met hoe je het formuleerde, ondanks dat er wedstrijden instaan die nu bezig zijn. Bv 1 om 18:00. Ik vat het niet helemaal meer.

Mis ik iets?

Ik zit ondertussen ook even wat anders te testen, maar onderstaande geeft 0 rows
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$query     = mysql_query("SELECT * FROM `wedstrijden` WHERE DATE(datum) = '2014-08-04%'");


en dit onderstaande geeft ze wel van vandaag terug.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$vandaag = date("Y-m-d");
$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
 
Willem vp

Willem vp

04/08/2014 19:23:26
Quote Anchor link
Ger van Steenderen op 04/08/2014 18:35:28:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT * FROM wedstrijden
WHERE
datum BETWEEN NOW() AND NOW() - INTERVAL 100 MINUTE

Dit gaat niet werken. Bij between moet je de laagste waarde als eerste noemen, dus:

WHERE datum BETWEEN NOW() - INTERVAL 100 MINUTE and NOW()
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/08/2014 19:31:11
Quote Anchor link
>> Dit gaat niet werken. Bij between moet je de laagste waarde als eerste noemen.

Pardon?

Dus 7 ligt wel tussen 5 en 10 maar niet tussen 10 en 5?

Toevoeging op 04/08/2014 19:33:47:

Inderdaad ....
 
Bart B

Bart B

04/08/2014 19:36:25
Quote Anchor link
Willem vp op 04/08/2014 19:23:26:
Ger van Steenderen op 04/08/2014 18:35:28:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT * FROM wedstrijden
WHERE
datum BETWEEN NOW() AND NOW() - INTERVAL 100 MINUTE

Dit gaat niet werken. Bij between moet je de laagste waarde als eerste noemen, dus:

WHERE datum BETWEEN NOW() - INTERVAL 100 MINUTE and NOW()


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
 
Willem vp

Willem vp

04/08/2014 20:16:30
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
    if (!args[1]->null_value && !args[2]->null_value)
      return (longlong) ((value >= a && value <= b) != negated);

(enigszins afhankelijk van het datatype, maar het komt allemaal op hetzelfde neer)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

04/08/2014 20:50:07
Quote Anchor link
Dat jouw opmerking klopte was ik inmiddels al achter.
Ik vind het alleen niet logisch om het zo te programmeren.
 
Willem vp

Willem vp

04/08/2014 22:04:34
Quote Anchor link
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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.