mysqli query op substring in php

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Peter Kroonenburg

Peter Kroonenburg

22/11/2019 11:41:13
Quote Anchor link
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.

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

PHP hulp

22/12/2024 14:59:56
 
Thomas van den Heuvel

Thomas van den Heuvel

22/11/2019 13:48:40
Quote Anchor link
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.
Gewijzigd op 22/11/2019 14:17:02 door Thomas van den Heuvel
 
Ivo P

Ivo P

22/11/2019 14:23:49
Quote Anchor link
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.
 
Peter van Kroonenburg

Peter van Kroonenburg

22/11/2019 14:52:23
Quote Anchor link
Thomas,
Bij mij geeft dit het resultaat
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<td><?PHP echo substr($row_rs_query["meetmoment"],11,5)?></td>


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 -
 
Michael -

Michael -

22/11/2019 14:59:24
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

22/11/2019 15:35:44
Quote Anchor link
Dan is de kolom waarschijnlijk geen DATETIME kolom? Hoe luidt de definitie van deze kolom en hoe ziet een complete waarde in zo'n kolom er uit?

En ja, TIME is wss beter (als het een DATETIME was) of dus gewoon opslaan in een aparte (tijds)kolom.
 
Ivo P

Ivo P

22/11/2019 15:57:41
Quote Anchor link
Peter van Kroonenburg op 22/11/2019 14:52:23:
Thomas,
Bij mij geeft dit het resultaat
<td>
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?PHP echo substr($row_rs_query["meetmoment"],11,5)?>
</td>

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


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
 
Adoptive Solution

Adoptive Solution

22/11/2019 16:01:57
Quote Anchor link
Helpt dit?

WHERE time(meetmoment) = $tijd

Maak van tijd '13:00:00'
Gewijzigd op 22/11/2019 16:05:43 door Adoptive Solution
 
Peter van Kroonenburg

Peter van Kroonenburg

22/11/2019 22:54:06
Quote Anchor link
Helaas, ook onderstaande versie geeft geen resultaat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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();
?>


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.
Gewijzigd op 22/11/2019 23:00:24 door - Ariën -
 
- SanThe -

- SanThe -

22/11/2019 22:59:30
Quote Anchor link
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.
 
Thomas van den Heuvel

Thomas van den Heuvel

22/11/2019 23:06:09
Quote Anchor link
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.
 
Peter van Kroonenburg

Peter van Kroonenburg

22/11/2019 23:46:30
Quote Anchor link
Opgelost!!

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
 



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.