Door
Peter Kroonenburg
op 22-11-2019 11:41
gewijzigd op 22-11-2019 23:00
3.559 views
Query op substring
Ik heb een datetime veld genaamd ‘meetmoment’ Ik wil nu een selectie maken op basis van dit veld maar alleen van het tijdstip in het veld.
BV alle records van 13.00 uur.
Hoe luidt de definitie van de meetmoment-kolom?
En weet je zeker dat je de goede lengte en startpositie te pakken hebt?
Als dit een DATETIME is, dan is het formaat yyyy-mm-dd hh:ii:ss.
Bij functies als substring begin je te tellen vanaf 1, dus dit zou dan (aangenomen dat het een DATETIME betreft) SUBSTR(meetmoment, 12, 8) of simpelweg SUBSTR(meetmoment, 12) moeten zijn.
En omdat het een string betreft zou de waarde $tijd tussen quotes moeten staan.
En als tijd (apart) interessant is dan loont het misschien de moeite om de informatie in twee aparte kolommen op te slaan.
Voer de query eens uit met de SUBSTR() in je SELECT, dan kun je zien wat je terugkrijgt. En je zou mysqli_errorno() kunnen inspecteren. Als deze verschilt van 0, of als de query zelf FALSE retourneert dan wil dit zeggen dat deze syntactisch niet klopt.
de functie (in mysql) genaamd TIME() lijkt me wel handig om een tijd te extracten uit een datetime veld.
Met een beetje geluk pakt mysql daar ook direct wat logica in mee, zodat hij niet eerst al je 15.000 records moet bewerken (substr) om uit te vinden welke records in aanmerking komen.
Ik zal ook kiezen voor een ingebouwde functie zoals Ivo zegt. Alleen het nadeel van TIME() is dat je zowel uur,minuten als seconden en evt. miliseconden krijgt. Gebruik dan HOUR() en MINUTE() of DATE_FORMAT(datetime, "%H:%i") om je tijd te vergelijken. Dit zal na verwachting sneller gaan dan met SUBSTR.
En als meetmoment een DATETIME is dan zou ik dat ook niet als string behandelen, maar meer als een timestamp. In PHP heb je hier de DateTime klasse voor. Misschien wat omslachtiger, maar het werkt, en het beschrijft beter wat voor type data je gebruikt, niet simpelweg een string, maar een (datum)tijd.
Of je voert de conversie meteen uit aan de MySQL-zijde door SELECT *, TIME(meetmoment) AS tijd te gebruiken. Dan kun je simpelweg $row_rs_query['tijd'] gebruiken.