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

Requêtes PostgreSQL Discussion :

Calculer une date moyenne


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut Calculer une date moyenne
    Bonjour,
    j'aurais besoin de faire une estimation d'une date moyenne, c'est à dire la date la plus "au milieu" d'un ensemble de dates. Ca me parait assez bizarre et je n'ai rien vu dans la doc qui parle de ça. Est-ce qu'il y a un moyen de le faire ?

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 383
    Points
    18 383
    Par défaut
    Je pense que je ferai quelque chose de la façon suivante :

    Je récupère la date la plus faible
    Je la soustrais à toutes les autres dates (ce qui me donne la durée de toutes les périodes)
    Je fais la moyenne de ces durées
    Je l'ajoute à la date la plus faible.

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    La date "la plus au milieu", ce serait plutôt la médiane que la moyenne
    http://fr.wikipedia.org/wiki/Médiane_(centre)
    La méthode pour la calculer est
    1. mettre les valeurs dans un tableau (pour ça voir la fonction array_accum dans la doc de postgresql)
    2. trier: une fonction de tri générique de tableau est dispo ici:
    http://www.postgres.cz/index.php/Pos...ral_array_sort
    3. récupérer la valeur au milieu du tableau. Si le nombre de valeurs est impair, le milieu correspond directement à une valeur, sinon prendre l'indice juste en dessous. Certains font aussi la moyenne des deux valeurs autour du milieu.

  4. #4
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Pardon j'ai fait un abus de langage avec "milieu", j'ai bien besoin de la moyenne et non pas la médiane. Du coup simplement obtenir la valeur centrale d'un tableau trié ne me suffit pas.

    Je viens d'ailleurs de penser que ma moyenne ne devra pas tenir compte de l'année, il me faut seulement une certaine époque de l'année. Je viens aussi de voir que PostGre fournit une fonction "EXTRACT doy" qui permet de récupérer le nombre de jours d'une date depuis le début de l'année. Partant de là il serait facile de calculer une moyenne sur des simples entiers.
    Par contre je ne vois pas d'équivalent pour ensuite reconstruire une date avec un nombre de jours...
    De plus j'imagine que créer une date sans année spécifique peut être embêtant. Je sens que je vais récupérer le nombre de jours et traiter tout ça hors SQL pour reconvertir en jours/mois. D'ailleurs je me demande si PostGre prend en compte les années bissextiles.

    Pour ceux qui voudraient une date moyenne tenant compte de l'année, un post parle d'une fonction "to_days" retournant le nombre de jours total depuis l'an zéro, mais je n'ai pas trouvé cette fonction dans la doc PostGre.

  5. #5
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 599
    Points
    12 599
    Par défaut
    Bonjour,
    J'ai pas PostgreSQL sous la main, mais quelque chose comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    SELECT (TIMESTAMP '2009-01-01 00:00' + AVG(EXTRACT(DOW FROM 'champDate')));

  6. #6
    Membre émérite
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Points : 2 834
    Points
    2 834
    Par défaut
    Tiens en effet j'avais pas vu qu'on pouvait faire ça, à ce moment là la construction de la date est plus simple en effet. La bonne syntaxe est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT date '2009-01-01' + 
    	cast(round(avg(extract(DOY FROM attribut)) - 1) AS integer)
    	AS date_moyenne
    	...FROM... etc
    Dans mon cas je n'avais pas besoin de timestamp mais seulement d'une date, mais ça peut facilement s'adapter. J'ai dû arrondir puis convertir le résultat de la moyenne car "date" ne peut s'additionner qu'avec un entier.

    J'obtiens un jour de plus à chaque fois qu'avec ma reconversion php. Je ne sais pas si c'est moi qui ai fait une erreur ou seulement si PostGre tient compte des années bissextiles (ce que je ne fais pas dans mon php).

    Edit : non en fait je viens de me dire que j'ajoute le nombre de jours à une date partant du 1er de l'an, elle compte donc déjà le premier jour comme passé. Pour corriger ça j'enlève 1 à la moyenne.

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

Discussions similaires

  1. Calculer une date dans 5 ans
    Par arthuro45 dans le forum Langage
    Réponses: 3
    Dernier message: 29/04/2010, 11h32
  2. calculer une date
    Par merlubreizh dans le forum Développement
    Réponses: 1
    Dernier message: 03/10/2008, 15h22
  3. Calculer une date - des jours (en anglais)
    Par mystikgirl30 dans le forum Excel
    Réponses: 2
    Dernier message: 14/11/2007, 15h41
  4. [Dates] calculer une date future
    Par arti2004 dans le forum Langage
    Réponses: 3
    Dernier message: 02/07/2007, 19h12
  5. calculer une date Langage c
    Par nestam dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/09/2005, 15h51

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