2017-10-09 1 views
0

J'ai besoin de calculer les jours avg entre la date de la vente:Calculer moyenne entre MySQL résultats

Mon DB est comme ceci:

id | customer | creation_date | payment_date 
1 |  234 | 2017/07/6 | 2017/07/8 
34 |  234 | 2017/08/4 | 2017/08/10 
53 |  234 | 2017/09/15 | 2017/09/17 
67 |  234 | 2017/10/1 | 2017/07/6 

donc je dois calculer de différence de jours (creation_date) entre Ordre 1 et Ordre 34, Ordre 34 et Ordre 53, Ordre 53 et Ordre 67, etc ...

et de calculer un AVG de jours en fonction du nombre de résultats.

donc je sais comment calculer la différence de jours entre 2 dates en utilisant ce petit script:

$seconds=strtotime($date1) - strtotime($date2); 
$difference=intval($seconds/60/60/24); 
$positive = $difference * -1; 

mais je ne pas savoir comment prendre la date du résultat las et le comparer avec la prochaine résultat.

S'il vous plaît quelqu'un qui peut m'aider avec cette énigme. Merci!

+0

Je voudrais vraiment embêtez pas avec le petit script – Strawberry

Répondre

3

Je pourrais être mal compris ce que vous cherchez, mais je pense quelque chose comme cela devrait fonctionner

(TO_DAYS(MAX(creation_date))-TO_DAYS(MIN(creation_date)))/(COUNT(1)-1)

Vous obtiendrez le total des jours entre le premier et le dernier; et diviser par le nombre d'espaces entre les ordres. Editer: .... et si vous souhaitez traiter les commandes à la même date qu'une seule commande, vous pouvez simplement changer COUNT(1) en COUNT(DISTINCT creation_date). Tout cela suppose que le concepteur db était sain d'esprit et utilisait réellement les types de données DATE pour les valeurs de date.


Pour résumer, la taille moyenne des travées doit être la même que la portée totale divisée par le nombre de travées.

+0

Ceci est en fait une solution très succincte. – fubar

+0

Je devrais utiliser cette ligne dans la requête SQL, non? –

+0

@GuillermoEsquivel c'est l'intention oui; mais si c'est plus facile et que vous avez déjà les données individuelles pour les enregistrements dans le code; le math '' (max-min)/(count-1) 'devrait encore fonctionner pour vous de la même façon. – Uueerdo

0

Vous pouvez garder une trace du résultat précédent en utilisant une variable en dehors de la boucle pour obtenir votre table MySQL, puis exécutez la boucle à travers les lignes de la table:

$last_positive = 0; 
while ($row = $result->fetch_assoc()){ 
    $date1 = $row['creation_date']; 
    $date2 = $row['payment_date']; 
    $seconds=strtotime($date1) - strtotime($date2); 
    $difference=intval($seconds/60/60/24); 
    $positive = abs($difference); 
    //DO SOME COMPARISON HERE 
    echo($last_positive >= $positive); 

    $last_positive = $positive; 
} 

Je vous suggère également d'utiliser abs pour obtenir la valeur absolue au lieu de multiplier par -1.

+0

Si vous utilisez PHP, je serais enclin à utiliser 'DateTime :: diff'. – fubar

0

AVEC CE SOLVED:

SELECT DATEDIFF(MAX(creation_date), MIN(creation_date))/(COUNT(creation_date) - 1) AS SaleAverage FROM table WHERE customer = '$customer'