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 :

soustraire des dates et renvoyer le resultat


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Par défaut soustraire des dates et renvoyer le resultat
    Bonsoir a tous, dans mon application de fin d'année en php, j'utilises des dates.

    J'ai donc un champ date dans ma table (date_mev) qui est de type timestamp without time zone (je dois avouer que je sais pas quelle est la difference entre avec et sans)

    je recupere la date du jour avec CURRENT_TIMESTAMP et c'est ici que les romains s'empoignent...

    je voudrais soustraire la date de ma table a celle du jour afin d'en recuperer le temps ecoulé... voivi ma fonction :

    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
    declare
     
    p_id_objet ALIAS FOR $1;
    mon_record record;
    currentdate record;
    BEGIN
     
    select into mon_record date_mev from projet.objet where id_objet = p_id_objet;
    SELECT INTO currentdate CURRENT_TIMESTAMP AS date_and_time;
    IF FOUND THEN
      RETURN currentdate.date_and_time - mon_record.date_mev;
    ELSE
      RETURN 0;
    END IF;
     
    END;
    la valeur de sortie est de type timestamp without time zone.

    l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Erreur SQL :
    ERROR:  invalid input syntax for type timestamp: "1739 days 17:38:10.0192719996"
    Pourriez-vous m'aiguiller svp

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    Bonsoir,
    c'est plutot logique, la difference entre un timestamp et un autre timestamp renvoi un interval, or ta fonction doit renvoyer un timestamp, regarde ta declaration, tu dois avoir une RETURNS timestamp il faut mettre RETURNS interval

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Par défaut
    Bien le bonjour, et merci beaucoup pour la reponse qui m'a precieusement aidé!



    Une derniere petite chose, je me suis apercu que ma fonction ne renvoyait pas exactement la valeur dont j'avais besoin...

    En fait il faudrait faire ceci :

    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
     
    declare
     
    p_id_objet ALIAS FOR $1;
    mon_record record;
    currentdate record;
    BEGIN
     
    select into mon_record date_mev,duree from projet.objet where id_objet = p_id_objet;
    SELECT INTO currentdate CURRENT_TIMESTAMP AS date_and_time;
    IF FOUND THEN
      RETURN currentdate.date_and_time - (mon_record.date_mev + mon_record.duree);
    ELSE
      RETURN 0;
    END IF;
     
    END;
    Seulement, ma duree est un integer...

    J'ai tenté des fonctions:
    TO_DATE()
    TO_TIMESTAMP()
    TIMESTAMP()
    etc...

    Mais jamais je n'ai pu trouver mon bonheur

    c'est la derniere petite chose que je demande (pour ce post bien sur )

    Encore merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Par défaut
    Personne???

  5. #5
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    a quoi correspond ta duree ? des minutes ? des secondes ?

    un methode simple pour faire une addition timestamp + interval :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select '2005-10-10 10:00'::timestamp, '2005-10-10 10:00'::timestamp + '12 minutes'::interval
    -- ca donne respectivement 2005-10-10 10:00    et 2005-10-10  10:12

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Par défaut
    hello,

    Un grand merci, ca fonctionne nickel chrome!

    Voici mon code :

    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
    declare
     
    p_id_objet ALIAS FOR $1;
    mon_record record;
    currentdate record;
    BEGIN
     
    select into mon_record date_mev,duree from projet.objet where id_objet = p_id_objet;
    SELECT INTO currentdate CURRENT_TIMESTAMP AS date_and_time;
    IF FOUND THEN
      RETURN -date_trunc('seconds',(currentdate.date_and_time - (mon_record.date_mev + (COALESCE(mon_record.duree)||' days')::interval )));
    ELSE
      RETURN 0;
    END IF;
     
    END;
    Et le resultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    gettempsrestant
     
    3 days 01:14:24
     
    1 ligne(s)

    Je ne savais pas qu'on pouvait specifier le type de donnée dans la requete avec des ::

    Encore merci a tous, et bonne journée

  7. #7
    Membre Expert
    Avatar de hpalpha
    Inscrit en
    Mars 2002
    Messages
    769
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 769
    Par défaut
    le :: s'appelle le CAST, tu as plusieurs facons de caster :

    '2005-10-10 10:00'::timestamp
    timestamp '2005-10-10 10:00'
    CAST('2005-10-10 10:00' as timestamp)

    perso je trouve :: plus simple

    juste un petit point, tu devrais changer ton COALESCE(mon_record.duree) en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(mon_record.duree,'0')
    parce que sinon ton coalesce est inactif (null devriendra null)

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2005
    Messages : 70
    Par défaut
    merci du coup de patte, je vais modifier ca de suite mais de toute facon, la duree ne saurait pas etre null

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

Discussions similaires

  1. Convertir et soustraire des dates
    Par jean003 dans le forum Débutez
    Réponses: 3
    Dernier message: 31/01/2011, 15h45
  2. soustraire des dates
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 25/10/2007, 06h56
  3. Soustraire des dates.
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 14/06/2007, 19h54
  4. Soustraire des dates
    Par skorpio dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 14/06/2007, 15h09
  5. Soustraire une date avec des jours et jours ouvrés
    Par celiaaa dans le forum VBA Access
    Réponses: 5
    Dernier message: 31/05/2007, 22h37

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