Hulp bij filteren datum en tijd uit database

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nanno Koerts

Nanno Koerts

16/01/2016 14:18:52
Quote Anchor link
Hallo,

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);
 
PHP hulp

PHP hulp

24/12/2024 04:02:16
 
Ben van Velzen

Ben van Velzen

16/01/2016 14:35:10
Quote Anchor link
Misschien is het handiger om gewoon de juiste kolomtypes te gebruiken, en daarbij dus meteen de aparte datum en tijd kolommen te vervangen door 1 DATETIME kolom. Dan kun je gewoon alles in de query opvangen en hoef je ook niet met datums tussen PHP en MySQL te gaan zitten gooien:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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
 
Nanno Koerts

Nanno Koerts

16/01/2016 14:42:22
Quote Anchor link
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.
 
Shamrock Modelbouw

Shamrock Modelbouw

16/01/2016 15:10:47
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?PHP
$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
 
Nanno Koerts

Nanno Koerts

16/01/2016 15:18:24
Quote Anchor link
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'); ??
 
Shamrock Modelbouw

Shamrock Modelbouw

16/01/2016 15:20:42
Quote Anchor link
Dat ligt eraan hoe de waardes opgeslagen staan in je database,

datum: Y-m-d
tijd: H:i:s
?

Dan kun je $huidigeTijd zetten als date("Y-m-d H:i:s");
 
Nanno Koerts

Nanno Koerts

16/01/2016 15:30:51
Quote Anchor link
THANKS, dit is wat ik even nodig had. Die concat staat niet in mijn woordenboek. Dank dank.
 
Ivo P

Ivo P

16/01/2016 20:29:35
Quote Anchor link
alleen,
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.
 
Ben van Velzen

Ben van Velzen

16/01/2016 23:23:05
Quote Anchor link
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.
 
Nanno Koerts

Nanno Koerts

17/01/2016 00:40:59
Quote Anchor link
Hoi Ivo en Ben,

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.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

17/01/2016 11:45:32
Quote Anchor link
Het is niet nodig om eerst in PHP de huidige tijd te bepalen en dan in SQL de datum en tijd aan elkaar te plakken. MySQL heeft zelf functionaliteiten om de huidige datum en tijd te gebruiken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
WHERE datum >= CURDATE() AND tijd_open >= CURTIME()


Als je (eenmalig) dit doet:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
CREATE INDEX idx_datetime ON agenda (datum, tijd_open)


Dan doet het er niet meer toe hoeveel rijen er in de tabel staan.
 



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.