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 :

requete sur une valeur journalière a une heure donnée


Sujet :

Requêtes PostgreSQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut requete sur une valeur journalière a une heure donnée
    Bonjour,


    Je dispose d'une base de donnée postgres qui collecte des informations avec un pas de tems de 5 minutes ( supervision hydraulique)
    Mes tables sont assez simples et j'ai un horodatage de ce type 2021-07-03 15:05:00
    Noms des tables :
    PK= evtcellule
    Timestamp = evttime
    Valeur = evtvalue

    j'en suis à ce stade
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT current_date 
    FROM PUBLIC.DT 
    WHERE EVTCELLULE=4689
    ORDER BY EVTTIME DESC LIMIT 100
    ce que je souhaite c'est faire une requête sur la date du jour mais avoir la valeur courante a 06h00
    Je suis assez novice en requête sql, merci pour votre aide
    Bonne journée
    lopipol

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 865
    Points : 11 755
    Points
    11 755
    Par défaut
    Bonjour,
    D'après l'aide en ligne des fonctions date/heure de PostgreSQL, tu peux utiliser make_timestamp() et date_trunc() pour "fabriquer" les deux bornes de date.
    Exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,0,0)
    select make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,4,0)
    Il suffit alors de prendre toutes les lignes dont l'horodatage se trouve entre ces deux bornes.

    Comme tu as un pas de 5 minutes, j'ai pris un peu de marge avec un intervalle de 4 minutes.


    Tatayo.

  3. #3
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci Tatayo,

    Je vais regarder l'aide en ligne d'un peu plus près, mais comme je l'ai indiqué, j'en suis au début de l'aventure requêtes SQL
    Pour le moment c'est un peu confus
    comment intégrer ta solution dans ma reqête globale ?

    merci pour ton aide

    lopipol

  4. #4
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    bon, a priori c'est plus complexe que prévu. Quelle galère

    je récapitule ce que je veux faire

    1) je veux récupérer la valeur d'une mesure dans une base postgrès qui est enregistrée chaque jour à 06h00 : exemple 2.30 m
    2) la date a prendre en compte est celle du système ( la date est donc une variable)
    3)la requête sera automatisée dans mon système de supervision et lancée tous les jours a 07h00

    Le soucis c'est que mon horodatage intègre la date et l'heure dans le même champs : comment puis je effectuer cela sur un horodatage du type 2021-07-03 15:05:00?

    une âme charitable pour m'aiguiller ?
    Je continue mes recherches
    merci

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 865
    Points : 11 755
    Points
    11 755
    Par défaut
    Il n'y a rien de vraiment compliqué ici.
    Les deux exemples que je t'ai donnés renvoient un timestamp pour respectivement 06:00:00 et 06:04:00 pour la date courante (car j'ai utilisé now()).

    Il suffit de récupérer la mesure dont le timestamp est entre ces deux valeurs, avec un between par exemple.
    Le fait que ton horodatage intègre la date et l'heure (bref que ce soit un timestamp) n'est pas un soucis, c'est dans l'absolue une bonne chose.

    Bref la requête ressemble à ceci:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select *
    from LaTable
    where horodatage between make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,0,0)
    and  make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,4,0)

    Comme je le disais, rien de magique ici.

    Tatayo.

  6. #6
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci Tatayo pour le temps que tu prends a solutionner mon problème, ce doit certainement être simple, mais pgadmin me retourne un message d'erreur de synthaxe
    lors du traitment de la requête
    je pense qu"il s'agit d'une erreur sur les parenthèses, je creuse la question

    Désolé de t'êmbêter avec cela...merci


    voici ma requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from public.dt where evtcellule='4989' 
    and horodatage between make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,0,0)
    and  make_timestamp(date_trunc('year',now()),date_trunc('month',now()),date_trunc('day',now)),6,4,0)
    et voici le message d'erreur

    ERROR: ERREUR:  erreur de syntaxe sur ou près de « , »
    LINE 4: ...w()),date_trunc('month',now()),date_trunc('day',now)),6,0,0)
                                                                    ^
    
    
    SQL state: 42601
    Character: 162

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 865
    Points : 11 755
    Points
    11 755
    Par défaut
    Autant pour moi, j'ai confondu date_trunc() et date_part().
    Accessoirement il faut changer "horodatage" dans mon exemple par le vrai nom de la colonne de ta table ...

    Tatayo.

  8. #8
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai modifié la requête comme ci-dessous,et j'ai toujours une erreur de syntaxe.
    Si tu as une idée de ce qui coince, sinon pas grave, je finirai bien par trouver.
    J'ai déja trop abusé de ton temps

    merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from public.dt where evtcellule='4989' 
    and evttime between make_timestamp(date_part('year',now())),date_part('month',now()),date_part(('day',now()),6,0,0)
    and make_timestamp(date_part('year',now())),date_part('month',now()),date_part(('day',now()),6,4,0)

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 865
    Points : 11 755
    Points
    11 755
    Par défaut
    Tu as des problèmes de parenthèses, elles sont mal placées.

    Tatayo.

  10. #10
    Candidat au Club
    Homme Profil pro
    Assistant aux utilisateurs
    Inscrit en
    juin 2022
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Assistant aux utilisateurs

    Informations forums :
    Inscription : juin 2022
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Bon, j'ai tourné la chose dans tous les sens , modifié les parenthèses , rient y fait

    Si quelqu'un a une autre idée

    Bonne soirée
    Lopipol

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from public.dt where evtcellule='4989' 
    and evttime between make_timestamp date_part('year',now()),date_part('month',now()),date_part('day',now(),6,0,0)
    and make_timestamp date_part('year',now()),date_part('month',now()),date_part('day',now(),6,4,0)

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    janvier 2009
    Messages
    4 865
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : janvier 2009
    Messages : 4 865
    Points : 11 755
    Points
    11 755
    Par défaut
    Make_Timestamp est une fonction, et je ne vois aucune parenthèse après son appel. Ca ne risque pas de fonctionner...
    Si tu te perds dans les parenthèses, les paramètres... Le plus simple est de commencer par la première fonction, et de prévoir une ligne par paramètre.
    Par exemple avec date_bin, qui prend 3 paramètres:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select date_bin(
    ,
    ,
    )
    D'après l'aide en ligne, combien de paramètres sont nécessaires à make_timestamp() ?
    Une fois ceci fait, tu passes à la deuxième fonction, ici date_part().
    Et ainsi de suite.
    Tu peux aussi indenter les lignes, la requête n'en sera que plus lisible.
    Par exemple:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select date_bin
    ('15 minutes'
    ,current_timestamp
    	(
    	0
    	)
    ,TIMESTAMP' 2001-01-01'
    )
     
    La requête est ainsi plus lisible, et il est très facile de faire la correspondance entre une parenthèse ouvrante et sa parenthèse fermante associée.

Discussions similaires

  1. Réponses: 8
    Dernier message: 20/10/2014, 04h28
  2. Réponses: 1
    Dernier message: 10/03/2011, 10h08
  3. Réponses: 3
    Dernier message: 15/06/2007, 12h06
  4. Réponses: 9
    Dernier message: 18/08/2005, 13h16
  5. Requete sur une proc stockée
    Par jeff37 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/04/2005, 00h56

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