mysqli query op substring in php
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.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$tijd='13.00';
$query ="SELECT meetmoment, ID ";
$query .="FROM suiker ";
$query .=WHERE SUBSTR(meetmoment,10,6) = $tijd ";
?>
$tijd='13.00';
$query ="SELECT meetmoment, ID ";
$query .="FROM suiker ";
$query .=WHERE SUBSTR(meetmoment,10,6) = $tijd ";
?>
Dit werkt niet. Kan iemand aangeven wat ik hier fout doe?
Bedankt,
Peter
Gewijzigd op 22/11/2019 23:00:39 door - Ariën -
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.
Gewijzigd op 22/11/2019 14:17:02 door Thomas van den Heuvel
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
en dan met name https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_time
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.
en dan met name https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_time
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.
Bij mij geeft dit het resultaat
Tijd 13:00 17:48 23:05 08:15 11:50 16:55 23:59 08:41 12:50 17:24 23:58 08:30 10:01 10:01 12:47
Dus start op 11
Gewijzigd op 22/11/2019 22:59:23 door - Ariën -
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 ja, TIME is wss beter (als het een DATETIME was) of dus gewoon opslaan in een aparte (tijds)kolom.
Peter van Kroonenburg op 22/11/2019 14:52:23:
dat is de php functie substr();
Mysql's substring functie is anders en begint bij 1 te tellen
Toevoeging op 22/11/2019 15:58:38:
https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_substr
WHERE time(meetmoment) = $tijd
Maak van tijd '13:00:00'
Gewijzigd op 22/11/2019 16:05:43 door Adoptive Solution
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
$tijd='13.00.00';
$query ="SELECT * ";
$query .="FROM suiker ";
$query .="WHERE time(meetmoment) = '$tijd' ";
$rs_query = mysqli_query($verbinding,$query) or die($mysqli_error($verbinding));
$row_rs_query = mysqli_fetch_assoc($rs_query);
$totalRows_rs_query= mysqli_num_rows($rs_query); ?>
<tbody>
<tr>
<td bgcolor="#ccc">Tijd</td>
</tr>
<tr>
<?PHP do { ?>
<td><?PHP echo substr($row_rs_query["meetmoment"],11,5)?></td>
</tr>
</tbody>
</table>
<?PHP } while ($row_rs_query = mysqli_fetch_assoc($rs_query));
exit();
?>
$tijd='13.00.00';
$query ="SELECT * ";
$query .="FROM suiker ";
$query .="WHERE time(meetmoment) = '$tijd' ";
$rs_query = mysqli_query($verbinding,$query) or die($mysqli_error($verbinding));
$row_rs_query = mysqli_fetch_assoc($rs_query);
$totalRows_rs_query= mysqli_num_rows($rs_query); ?>
<tbody>
<tr>
<td bgcolor="#ccc">Tijd</td>
</tr>
<tr>
<?PHP do { ?>
<td><?PHP echo substr($row_rs_query["meetmoment"],11,5)?></td>
</tr>
</tbody>
</table>
<?PHP } while ($row_rs_query = mysqli_fetch_assoc($rs_query));
exit();
?>
Edit:
Ik heb code-tags geplaatst. Gelieve dit in het vervolg zelf toe te voegen aan je bericht.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Zie ook: Veel gestelde vragen: Welke UBB-codes kan ik gebruiken.
Gewijzigd op 22/11/2019 23:00:24 door - Ariën -
Adoptive Solution op 22/11/2019 16:01:57:
Maak van tijd '13:00:00'
Peter van Kroonenburg op 22/11/2019 22:54:06:
$tijd='13.00.00';
Dit is niet hetzelfde.
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.
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 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.
Met de laatste tip, alleen had ik nog een foutje gemaakt 13.00.00 ipv 13:00:00. Te lang achter het scherm gezeten waarschijnlijk.
Bedankt allen voor de hulp.
Fijn weekend.
Peter