Hulp bij filteren datum en tijd uit database
Ik zit enorm te stoeien met een script om te filteren bij datum en tijd uit de MySql database.
Kort uitgelegd wat ik heb:
Ik heb een agenda in de database staan met een kolom datum en een kolom tijd.
De items in de agenda filter ik bij de datum. Is deze verstreken, laat dan het item niet meer zien. Dit werkt prima.
Nu wil ik dit ook met de tijd doen voor enkel dat item. En nu raak ik in de war. Want als ik dit in de SELECT plaats, filtert hij alle items die groter zijn dan de servertijd.
Wie wil en kan me helpen om dit te realiseren?
$serverdatum = date('Y-m-d');
ini_set('date.timezone', 'Europe/Berlin');
$time = date('H:i', time());
$sql = "SELECT * FROM agenda WHERE datum>='$serverdatum' AND tijd_open>='$time' AND Status='Aan' ORDER BY datum, tijd_aanvang ASC";
$result = mysql_query($sql);
Code (php)
1
2
3
2
3
<?php
$sql = "SELECT * FROM agenda WHERE datumtijd >= NOW() AND status = 'Aan' ORDER BY datumtijd";
?>
$sql = "SELECT * FROM agenda WHERE datumtijd >= NOW() AND status = 'Aan' ORDER BY datumtijd";
?>
Gewijzigd op 16/01/2016 14:35:33 door Ben van Velzen
Huh? Dat wil dus zeggen dat ik alles aan moet passen... En dat was ik niet van plan. En dit gaat niet werken in de uitwerking van mijn agenda. Dus... Graag een oplossing voor hetgeen waar ik nu sta. Ook al is het dan wat complexer dan het kan.
Code (php)
1
2
3
2
3
<?PHP
$sql = "SELECT * FROM agenda WHERE concat(datum,' ',tijd_open) >= '$huidigeTijd' AND Status='Aan' ORDER BY datum, tijd_aanvang ASC";
?>
$sql = "SELECT * FROM agenda WHERE concat(datum,' ',tijd_open) >= '$huidigeTijd' AND Status='Aan' ORDER BY datum, tijd_aanvang ASC";
?>
Zoiets?
Gewijzigd op 16/01/2016 15:11:16 door Shamrock Modelbouw
Hier wordt ik al blij van... Maar, hoe combineer ik dan de date en time naar $huidigeTijd? Is dat te doen met $serverdatum = date('Y-m-d-H-i'); ??
datum: Y-m-d
tijd: H:i:s
?
Dan kun je $huidigeTijd zetten als date("Y-m-d H:i:s");
THANKS, dit is wat ik even nodig had. Die concat staat niet in mijn woordenboek. Dank dank.
laten we ons eens voorstellen dat het een vrij volle agenda is waarin over 3 jaar 10.000 entry's staan.
concat(datum,' ',tijd_open) > iets
dat betekent dat je database eerste alle 10.000 records af moet gaan om daarbij de 2 kolommen tegen elkaar aan te plakken tot een string. Daarna kan hij het gaan vergelijken met "iets"
Met een beetje geluk zou je dit wat kunnen versnellen door:
WHERE datum >= CURRENT_DATE AND CONCAT(datum, ' ', tijd_open) > '....'
Maar in wezen ben je nu een lapmiddel aan het zoeken voor een fout uitgangspunt. Vraag je dus af, of het écht zo ontzettend veel moeite is om alles nog op een goed uitgangspunt te zetten.
In principe zou het zoeken naar "tijd_open" en alle scripts al heel snel tot alle query's en al het gebruik van iets als $row['tijd_open'] moeten leiden.
De insert-query's en update-query's hoeven maar beperkt aangepast te worden. Desnoods zou je het zelfs met triggers kunnen doen in de database.
De select-query's kun je ook eenvoudig aanpassen door met date_format() of date(), time() toch de 2 kolomwaarden die je al had terug te gevne:
SELECT DATE(datum) as datum, TIME(datum) as tijd_open FROM tabel
Aangezien het om een agenda gaat, lijkt met deze informatie tamelijk essentieel in je applicatie. Wel iets om juist dat goed in te richten.
Anders blijf je zitten met een zwakke bodem in je code.
Zeer terechte opmerkingen, daarom ook mijn suggestie tot veranderen van het datamodel. Eventueel zou je ook views in combinatie met de views die Ivo al suggereert kunnen gebruiken om de applicatie niet aan te hoeven passen. Het advies is echter wel met klem om je datastructuur correct te hebben, en de hackfix die hier geboden wordt niet te gebruiken.
Ik ben me er van bewust dat ik geen programmeur ben en dat mijn kennis van php erg nihil is.
Desondanks heb ik het met snippets en uitleg op het internet voor elkaar kunnen krijgen om gegevens in de database te laten zetten en met scripting het er weer uit te halen met diverse opties.
Het gaat hier om een theateragenda met diverse onderdelen. Er komen hooguit 100 items per jaar in de database te staan. En na elk seizoen haal ik de database weer leeg. Dit loopt nu al ruim 8 jaar zo en werkt prima. Het enige wat me nog niet lukte was het op een bepaald tijdstip uit het overzicht te kunnen halen.
En dankzij de Concat functie lukt me dit nu wel. Dus ik ben blij met deze oplossing al is het dan niet in de ogen van jullie de beste bodem.
Als er iemand is die me wil helpen het beter te doen, dan sta ik daarvoor open. Maar wie bied zich aan om hier naast me te komen zitten? Ik snap maar 0,003% van wat ik met PHP zou kunnen doen.
Als je (eenmalig) dit doet:
Dan doet het er niet meer toe hoeveel rijen er in de tabel staan.