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

 PostgreSQL Discussion :

timediff, postgresql en python


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut timediff, postgresql en python
    Bonjour à tous,
    Je suis débutant en base de données sur python, et j'essaie de comprendre un code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    UPDATE client
            SET d = 0
            WHERE TIMEDIFF(CURTIME(), date_ajout) > "01:00"
    Donc si je comprend bien, ça dit : dans la table client modifier d pour toute ligne supérieur à une heure ?
    Mais date_ajout est une colonne de la ligne (qui a été remplit préalablement )?
    timediff est que pour MySQL ?
    Merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Le code est bien à 100% du SQL avec un "dialecte" MySQL. Pas de lézards ni de python

    Ceci dit j'avoue que la logique de la requête m'échappe un peu.

    Ce que ça fait :
    remettre à 0 les valeurs dans la colonne d si l'heure contenue dans la colonne date_ajout est supérieure à 1:00 par rapport à l'heure d’exécution.

    Ce qu'on peut en déduire :
    * on imagine que date_ajout a une valeur par défaut. Pure supputation. --> C'est quoi la valeur par défaut pour d ?
    * on comprend bien ce que veut dire date_ajout ; c'est plus compliqué pour la colonne d ! --> pas le même développeur ?
    * relever le fait que l'ajout de la ligne date de plus d'une heure aurait pu être fait via une simple requête. --> d doit pouvoir être changé manuellement et arbitrairement à autre chose que 0 sinon c'est une faute.
    * soit cette requête est lancée plusieurs fois par jour => on flague automatiquement les insertions de plus d'une heure
    soit cette requête est lancée une fois par jour à une heure bien précise => c'est la seule écriture que le développeur à trouvé pour repérer les insertions faites par un job planifié (c'est super moche)
    Le savoir est une nourriture qui exige des efforts.

  3. #3
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    En gros ce que je cherchait c'est entrer une valeur dans d et au bout d'heure on le met égale à 0, pour toute les colonnes de d dont ça fait déjà une heure quelle a été entré

  4. #4
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par haku972 Voir le message
    En gros ce que je cherchait c'est entrer une valeur dans d et au bout d'heure on le met égale à 0, pour toute les colonnes lignes de d dont ça fait déjà une heure quelle a été entré
    En gros, c'est pas clair.

    Voici un florilège de questions qui montre à quel point l'explication de ce que tu cherche à faire ne m'est pas accessible :
    1- quelle est la signification humaine que tu donnes à d ?
    2- quelle est l'importance de consommer de l'espace disque pour stocker d ?
    3- si on a mis d='toto' une 1/2 heure après sa création, au bout d'une heure on doit quand même mettre d=0 ? pourquoi ?
    4- si on a mis d=toto 2 heures après sa création, lors la prochaine exécution de la requête on doit quand même mettre d=0 ? pourquoi ?

    Puis surtout le début du post commence par :
    j'essaie de comprendre un code
    suivi par :
    ce que je cherchait c'est entrer une valeur dans d
    Tu ne comprends pas le code que tu crée ???
    Le savoir est une nourriture qui exige des efforts.

  5. #5
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    1- d est une info sur une personne donnée qui sera traité différament selon d = 0 ou d != 0
    2- pour garder l'info sur cette personne disponible
    3- dès que d != 0, à partir de là on lance le compte pour être supprimé une heure après, pour que la personne relié a d soit traité differament de ceux dont d = 0
    4- oui, c'est dès que d !=0 que l'on compte pour le changé, parce que les personne relié a leur d seront traité différament selon d != 0 et d = 0

    Pour tout les lignes créer, leur d sera actualisé selon l'heure de modification de d, c'est un code que j'essaie de créer, je cherche la bonne requête sql pour postgre

  6. #6
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    J'ai créé une table avec d, date_ajout. Puis a chaque fois que je modifie d pour que ce soit != 0 je met la date à laquelle je le fait dans date_ajout, puis globalement pour tout les date_ajout moins le temps actuel qui sont supérieur à une heure il y a une modification de d pour la remettre = 0
    Je ne comprend pas trop les requêtes que je trouve sur le net j'ai besoin d'aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE client
            SET d = 0
                WHERE DATEDIFF(DATE_PART('day', now()::timestamp - date_ajout::timestamp) * 24 +
                                           DATE_PART('hour', now()::timestamp - date_ajout::timestamp)) * 60 +
                                           DATE_PART('minute', now()::timestamp - date_ajout::timestamp) > 60

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Pour être direct : je réprouve le fait de nommer une colonne d.
    C'est comme si on appelait en vrai une table T1.
    Puis tant qu'on y est c1 pour la première colonne, c2 pour la seconde et ainsi de suite pour toutes les tables et toutes les colonnes.

    Ceci étant dit passons à la question.

    soit la table client :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE client 
    ( id_client INT GENERATED ALWAYS AS IDENTITY
    , raison_sociale_client varchar(50)
    , date_ajout TIMESTAMP DEFAULT NOW()
    , date_modif TIMESTAMP DEFAULT NOW()
    )
    Les lignes des clients qui ont été modifiées depuis plus d'une heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_client, raison_sociale, date_modif, 0 as d
    FROM client
    WHERE date_modif < NOW() - interval '1 hour'
    Notes :
    Pas besoin de créer la colonne d dans la table.
    La date de création est différente de la date de modification

    L'explication du contournement de DATEDIFF : http://www.sqlines.com/postgresql/how-to/datediff
    Le savoir est une nourriture qui exige des efforts.

  8. #8
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    C'est sur ce site que j'essai de comprendre les requêtes
    Je ne comprend pas bien la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    SELECT id_client, raison_sociale, date_modif, 0 as d
    FROM client
    WHERE date_modif < NOW() - interval '1 hour'
    Pourquoi date_modif et date_ajout ?
    puis je faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE NOW() - date_modif > 60 pour 60min
    Et pourquoi ne pas utiliser un update ?
    Désolée si je suis lourd, j'essai de bien tout comprendre

  9. #9
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par haku972 Voir le message
    Je ne comprend pas bien la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id_client, raison_sociale, date_modif, 0 as d
    FROM client
    WHERE date_modif < NOW() - interval '1 hour'
    Du coup c'est moi qui ne comprend pas ce que tu ne comprends pas
    Quels sont les éléments incompris ?
    Comment interprète tu cette requête ?

    Citation Envoyé par haku972 Voir le message
    Pourquoi date_modif et date_ajout ?
    Pour la même raison qu'on appelle un chat un chat et un chien un chien

    Citation Envoyé par haku972 Voir le message
    puis je faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WHERE NOW() - date_modif > 60 pour 60min
    MySQL n'est pas rancunier. Tu peux toujours tester par toi même

    Citation Envoyé par haku972 Voir le message
    Et pourquoi ne pas utiliser un update ?
    Pour pouvoir utiliser un UPDATE il faut que la colonne existe dans la table.
    Or, définir dans une table une colonne qui peut être retrouvée par "calcul" représente une des formes de dé-normalisation.
    Il y a de nombreux débats et articles sur la normalisation sur ce site. N'hésite pas à te renseigner
    Le savoir est une nourriture qui exige des efforts.

  10. #10
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    C'est le "0 as d " que je ne comprend pas

    La requête dit de sélectionner id_client, raison_sociale, date_modif de la table client qui ont date_modif inférieur à maintenant avec un interval d'un heure

    Ok merci je vais regarder les articles sur la normalisation

    Je viens de comprendre je pense que pour postgre c'est date_part qu'il faut que j'utilise comme ceci pour avoir les minutes d'écart
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     WHERE (DATE_PART('day', NOW() - date_modif) * 24 + 
                   DATE_PART('hour', NOW() - date_modif)) * 60 +
                   DATE_PART('minute', NOW() - date_modif)> 40
    est ce que l'on peut l'écrire ainsi ?

  11. #11
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Citation Envoyé par haku972 Voir le message
    C'est le "0 as d " que je ne comprend pas
    Puisque visiblement tu tiens à avoir une colonne avec un 0 dedans, voici comment l'afficher.

    Citation Envoyé par haku972 Voir le message
    Je viens de comprendre je pense que pour postgre c'est date_part qu'il faut que j'utilise comme ceci pour avoir les minutes d'écart
    Oui, PostgreSQL n'a pas la fonction Date_diff. Le script proposé est un contournement.

    Or, ton cas n'est pas le même.
    Tu ne cherche pas à avoir l'intervalle de temps entre 2 colonnes de la table mais entre une colonne et "maintenant".
    Or la valeur de "maintenant" n'est pas inscrite dans une colonne de la table.

    Citation Envoyé par haku972 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     WHERE (DATE_PART('day', NOW() - date_modif) * 24 + 
                   DATE_PART('hour', NOW() - date_modif)) * 60 +
                   DATE_PART('minute', NOW() - date_modif)> 40
    est ce que l'on peut l'écrire ainsi ?
    On peut tout ! A toi de tester.
    Petite remarque :
    * 1 heure ça fait 60 minutes
    * Si tu dois revenir sur ta requête, mettons dans 3 mois, tu préfèreras lire quel code ?
    Le savoir est une nourriture qui exige des efforts.

  12. #12
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Au final cette requête me donne ce que je veut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    WHERE (DATE_PART('day', NOW() - date_modif) * 24 + 
                   DATE_PART('hour', NOW() - date_modif)) * 60 +
                   DATE_PART('minute', NOW() - date_modif)> 40
    Si tu dois revenir sur ta requête, mettons dans 3 mois, tu préfèreras lire quel code ?
    Mais avec mon niveau de débutant je n'arrive pas a prendre conscience des difficultés de lecture dans 3 mois, si vous pouvez m'expliqué

  13. #13
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Le fait que la clause where donne le résultat voulu c'est parfait;
    C'est juste que ça ne filtre pas selon un délais d'une heure comme annoncé.

    D'ores et déjà si tu n'arrive pas à comprendre pourquoi la conditionnelle ne filtre pas sur une période de 60 minutes c'est que t'as du mal à comprendre aujourd'hui ce que ça fait alors que ça fait plusieurs jours que t'as le nez dessus !

    La facilité de lecture d'un code permet :
    - moins d'erreurs
    - une maintenance (mise à jour de la requête) facilitée.

    Compare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE (DATE_PART('day', NOW() - date_modif) * 24 + 
                   DATE_PART('hour', NOW() - date_modif)) * 60 +
                   DATE_PART('minute', NOW() - date_modif)> 40
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE date_modif < NOW() - interval '1 hour'
    De mémoire (sans passer par un copier-coller donc) quelle est la syntaxe que t'as retenu ?
    Le savoir est une nourriture qui exige des efforts.

  14. #14
    Membre du Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Décembre 2018
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Décembre 2018
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Oui je sais pour les une heure, je l'avais diminué pour tester.
    Celle ci car elle est plus courte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE date_modif < NOW() - interval '1 hour'
    ok j'ai compris merci

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

Discussions similaires

  1. timediff, base de données, postgresql en python
    Par haku972 dans le forum Général Python
    Réponses: 2
    Dernier message: 08/05/2019, 16h10
  2. [Python+PostgreSQl] lenteur de requêtes
    Par guestCam dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 08/08/2007, 13h41
  3. Test Access Python Postgresql
    Par jnore dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 27/12/2006, 00h32
  4. Utiliser Python et PostGresql pour créer un site Web
    Par rvweb dans le forum Réseau/Web
    Réponses: 8
    Dernier message: 22/10/2006, 20h03
  5. python wxpython postgresql
    Par frouty dans le forum wxPython
    Réponses: 3
    Dernier message: 14/06/2006, 06h01

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