IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Comment faire la moyenne des dates [Débutant]


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut Comment faire la moyenne des dates
    Salut les amis
    je suis nouveau et j'espère ne pas vous emmerder par mes questions débiles.
    En Bref, j'ai une application dont la base est Access 2007, une table Enseignants, une Table élèves...
    J'ai réussi à faire l'ajout, la modification, la suppression, l'impression pas encore.
    Ce qui est demandé maintenant c'est comment trouver la moyenne des ages des élèves par classe et cela par leur date de naissance.
    C'est la première fois que je calcule la moyenne des âges et je ne sais quoi faire.

    Merci.

  2. #2
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AVG(DiffDate ("yyyy", [DateNaissance], Date())) FROM TableEleve
    Requête à tester, je ne l'ai pas fait

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Salut
    Merci mon ami pour ta réponse
    J'ai essayé mais il y a Erreur de syntaxe

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Ne serait-il pas plus simple que la requete renvoie la date, de la transformer en age et de faire la moyenne des ages ?

    Pourquoi la moyenne des dates est imposée ?

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut
    Salut prologic
    c'est juste une idée, mais si tu propose mieux je l'accepte. je cherche la moyenne des âges précisément mais j'ai cru qu'on doit passer par la date de naissance.
    merci pour ta réponse et ton idée, je vais y travailler dessus.
    et si quelqu'un trouve une solution prière de la publier pour que tous le monde en profite.

  6. #6
    Membre régulier
    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Novembre 2006
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien Help Desk
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2006
    Messages : 129
    Points : 106
    Points
    106
    Par défaut
    Avec la convertion en age tu peux obtenir une moyenne assez précise au jour près je dirais. On va pas miser sur la seconde, c'est trop aléatoire.


    Je n'ai pas la solution toute faite, mais admettons que tu utilise un While sur la réponse de ta requete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    dateactuelle = Now
    Dim totalAge as integer = 0
    Dim nbAge as integer = 0
    Dim moyenneJour as Long
     
    While....
    totalAge += DateDiff("d",[date_naissance_eleve],dateactuelle)
    nbAge +=1
    Wend
     
    'Calcul du nombre de jours moyen vécu par un élève.
    moyenneJour = totalAge / nbAge
     
    'On ramène au nb d'année
    nbAnnees = Int(moyenneJour / 365.25)
    Je n'ai testé le code, mais ca doit donner ce genre de chose.

  7. #7
    Membre éclairé Avatar de chamamo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    588
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 588
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par prologic Voir le message
    Avec la convertion en age tu peux obtenir une moyenne assez précise au jour près je dirais. On va pas miser sur la seconde, c'est trop aléatoire.


    Je n'ai pas la solution toute faite, mais admettons que tu utilise un While sur la réponse de ta requete.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    dateactuelle = Now
    Dim totalAge as integer = 0
    Dim nbAge as integer = 0
    Dim moyenneJour as Long
     
    While....
    totalAge += DateDiff("d",[date_naissance_eleve],dateactuelle)
    nbAge +=1
    Wend
     
    'Calcul du nombre de jours moyen vécu par un élève.
    moyenneJour = totalAge / nbAge
     
    'On ramène au nb d'année
    nbAnnees = Int(moyenneJour / 365.25)
    Je n'ai testé le code, mais ca doit donner ce genre de chose.
    Ça s'appelle pourquoi faire simple quand on peut faire compliqué,
    pourquoi faire tout un programme alors qu'on peut le faire dans la requête avec moins de lignes

    la requête va être du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT AVG(DateDiff("d",[date_naissance_eleve],Date())) / 365
    FROM...

  8. #8
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Faut encore voir en fonction de la méthode de calcul pour l'age, car personnellement j'ai moi même 29 ans et non pas 29.89. A la limite je veux bien admettre que je suis dans ma 30ème année car c'est ce que me donne ma méthode.

    Mais on s'éloigne du sujet de base. Quoique pas tant que ça...

    La requête SQL Access ressemblera donc à ceci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AVG (DateDiff("yyyy",[Naissance],Date())) As Age FROM Table;
    Ceci fonctionne sur une requête Access, je garantis pas que le DateDiff passe en requête SQL en dehors de Access (rarement fait ce genre de truc en dehors d'une application Access, mais on s'éloigne encore du sujet). A adapter en fonction de ta table et les champs. A noté que As Age indique un nom de colonne pour la requête, ça n'a aucun rapport avec la structure de ta base de donnée. Tu peux mettre As Tartanpion si tu veux. (C'est néanmoins obligatoire et sanctionné par une erreur).

    Si ça fonctionne tu peux adapter la requête en fonction de ta méthodologie de calcul et les pistes indiquées précédemment. Si ça ne fonctionne pas, charge les dates de naissances dans une liste et utilise LinQ pour faire la requête (au moins on avancera sur la résolution du problème).

    Quand à savoir s'il faut mieux faire le calcul dans la requête ou après dans le code. Il faut savoir qu'une base de donnée est à priori (on parle d'Access là, faut pas déconner non plus) plus rapide pour effectuer des opérations diverses et variées sur des enregistrements. De plus on fait transiter sur le réseau (en cas de client-serveur) une seule valeur au lieu d'un nombre non défini d'enregistrement. Quand on a 1'000'000 d'élève dans sa base de donnée ça fait une différence.

    Bref on a, en général, moins de problème de performance en effectuant un maximum de calcul du coté de la base de donnée.

  9. #9
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Avril 2013
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2013
    Messages : 121
    Points : 77
    Points
    77
    Par défaut calcul du moyenne d'âge
    Rebonjour
    Voila ce que j'ai trouvé et ça marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
       Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim N1, N2, N3 As Integer
            Cn.Open() 'Ouvrir la connexion
            If Cn.State = ConnectionState.Open Then 'Verifier si la connexion est faite
                Cmd.CommandText = "Select DateNaissance From Elèves"
                Cmd.Connection = Cn
                Dr = Cmd.ExecuteReader()
                While Dr.Read
                    N1 = 0
                    N1 = Val(Format(Now, "yyyy")) - Val(Mid(Dr("DateNaissance "), 7, 4))
                    N2 = N2 + N1 'Variable qui accumule la somme des âges
                    N3 = N3 + 1 'Variable qui accumule le Nb d'enregistrements lu
                    Label1.Text = Format(Val(N2 / N3), "0.0") 'Affiche le résultat avec un seul chiffre après la virgule
                End While
                Dr.Close()
                Cn.Close() 'Fermeture de la connexion
            Else
                MsgBox("La connexion a échoué. Vérifier la connexion réseau ou l’existence de la base", 0 + 16, " Échec") 'Message en cas d’échec
            End If
        End Sub
    Je le publie pour que les autres puissent avoir une idée.

    Merci pour tous qui m'ont proposés des solutions et ceux qui n'ont pas répondu.

    La proposition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AVG(DiffDate ("yyyy", [DateNaissance], Date())) FROM TableEleve
    ne marche pas avec moi

    Qu revoir pour une autre question.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 07/07/2015, 07h50
  2. Réponses: 1
    Dernier message: 18/07/2014, 15h39
  3. [c#] comment faire pour garder des noeuds ouverts treeview?
    Par irnbru dans le forum Windows Forms
    Réponses: 2
    Dernier message: 11/11/2005, 00h47
  4. Réponses: 4
    Dernier message: 14/10/2005, 14h02
  5. comment faire pour developper des prog en win32
    Par rhodan51 dans le forum Autres éditeurs
    Réponses: 11
    Dernier message: 09/11/2003, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo