Trier un tableau par interval de temps

Petit nouveau ! | 1 Messages

02 janv. 2019, 16:54

Bonjour,

j'ai besoin de votre aide, voila je récupères des informations sur la creation de dossier de ma BDD, et dans les infos que je récupère chaque dossier a le champ (exemple : 'created'=>2015-10-29 00:00:00).

Ce que je veux faire c'est faire un tableau par rapport a un intervalle de 10mins pour plus de compréhension je prends tout mes dossier que j'ai pu créer entre 7H du matin à 20H du soir et j'aimerais créer un tableau qui me compte le nombre de dossier que j'ai pu créer toute les 30 minutes:

exemple:

$tab = {

'10:00'=> 2, //nombre de dossier creer entre 10:00 et 10:30
'10:30'=> 0, //nombre de dossier creer entre 10:30 et 11:00
'11:00'=> 60, //nombre de dossier creer entre 11:00 et 11:30
'11:30'=> 4,
'12:00'=> 5,
'12:30'=> 7,
'13:00'=> 1
}

Voila le type d'information que je voudrais dans mon tableau, or je ne vois pas du tout comment je pourrais le faire si quelqu'un a une idée ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 janv. 2019, 18:17

Bonjour,

Alors le plus simple serait de le faire plutôt par heure (ou par créneau de 10 minutes).
Si tu acceptes ce compromis alors tu pourras extraire les infos voulues en 1 seule requête SQL en ajoutant la clause GROUP BY(SUBSTRING(created,0,15))
:arrow: L'explication c'est que tu coupes le champ created juste après les heures (donc au 15ème caractère), c'est ce à quoi sert le SUBSTRING(created, 0, 15)
Puis tu demandes à MySQL de regrouper tous les enregistrements qui ont ce même champ coupé (et donc sont sur la même heure).
Si tu veux faire cela sur les dizaines de minutes, il te suffit de mettre 16 au lieu de 15 pour couper après le 16è caractère du champ created.

En gros ça donnerai un truc du genre :
SELECT SUBSTRING(created, 0, 15), COUNT(*) FROM ta_table WHERE 1 GROUP BY(SUBSTRING(created,0,15)); 
Si tu veux n'afficher que l'heure sans la date, tu peux changer le SUBSTRING pour ne pas commencer à 0 mais au 11ème caractère, et ajouter "00" avec la fonction MySQL CONCAT()

+ d'infos sur GROUP BY : https://sql.sh/cours/group-by
+ d'infos sur CONCAT() : https://sql.sh/fonctions/concat
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

02 janv. 2019, 18:38

Si tu veux vraiment faire des créneaux de 30 minutes, tout dépend sur combien de jour tu dois faire cela.
Si c'est uniquement sur 1 seule journée, alors une solution "quick & dirty" serait de faire autant de requête qu'il y a de demi-heure (dans une boucle quand même) en utilisant la clause MySQL BETWEEN.
Exemple :
SELECT * FROM ta_table WHERE created BETWEEN demieheure_debut AND demieheure_fin
+ d'infos : https://sql.sh/cours/where/between
Quand tout le reste a échoué, lisez le mode d'emploi...