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

SQL Oracle Discussion :

[SQL ORACLE] Soustraction de deux timestamps


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut [SQL ORACLE] Soustraction de deux timestamps
    Bonjour,
    je dispose de deux timestamps dans une table, l'un pour le début d'un évènement et l'autre pour la fin.
    j'aimerais savoir quelle requête utiliser pour afficher le nombre de jours qui se sont écoulés entre ces deux dates...
    J'ai essayé plusieurs requêtes... comme select date2-date1... et je me suis lancé dans le TO_CHAR...sans succès, elles me renvoient toutes des erreurs... Je vais craquer !

    Merci d'avance !
    Bonne journée et prog' à tous !

  2. #2
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    si tu veux juste un nb de jours,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    trunc(timestamp2) - trunc (timestamp1)
    devrait faire l'affaire...

  3. #3
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Malheureusement, j'obtiens l'erreur suivante : t
    ype de données incohérents : NUMBER attendu ; TIMESTAMP obtenu

    Merci qd même yorglaa

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    quels est le fomat de tes timestamp ? comment les obtiens-tu et comment sont-il stockés (colonne date d'un table, autre ?) ?

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select trunc(((datefin-datedebut)*24))||'h'||round( ( (((datefin-datedebut)*24)-trunc((datefin-datedebut)*24))*60 ) ) from dual
    Essayes un truc de ce genre !!!
    Chez moi ça marche sans pb !

  6. #6
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    si tu as accès à Metalink, va voir cette note :
    http://metalink.oracle.com/metalink/...&p_id=149118.1

    y a plein de choses utiles sur les TimeStamp

  7. #7
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Posté le: Jeu Juil 01, 2004 16:50 Sujet du message:

    --------------------------------------------------------------------------------

    Code:
    select trunc(((datefin-datedebut)*24))||'h'||round( ( (((datefin-datedebut)*24)-trunc((datefin-datedebut)*24))*60 ) ) from dual


    Essayes un truc de ce genre !!!
    Chez moi ça marche sans pb !
    Après avoir tapé cette requête, j'obtiens cette erreur : type de données incohérent : Number attendu ; INTERVAL obtenu.

    Merci qd même marsup54 !

  8. #8
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Malheureusement Yorglaa, je n'ai pas d'accès à metalink...
    Le format de mes timestamps est le suivant : DD-month-YYYY HH:MM:SS et ils sont stockés dans une colonne timestamp d'une table...

  9. #9
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    OK, alors vas-y comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select to_date(to_char(timestamp2,'ddmmyyyy')) - to_date(to_char(timestamp1,'ddmmyyyy')) from ma_table ;
    le but est transformer ton timestamp d'abors en char, format ddmmyyyy puis à nouveau en date...

  10. #10
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Par défaut
    to_char(datedebut,'DD/MM/YYYY HH24:MI')
    Mets cette ligne à la place des champs datedebut et datefin !!!

    Chez moi ça marche bien !!!

    Tes champs sont bien de type date ?

    Chez moi, j'ai cette requète est ça fonctionne très bien !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select to_char(suivi_datedebut,'YYYY/MM/DD HH24:MI')||to_char(suivi_datefin,'YYYY/MM/DD HH24:MI'),
    replace('de '||to_char(suivi_datedebut,'DD/MM/YYYY HH24:MI')||' à '||to_char(suivi_datefin,'DD/MM/YYYY HH24:MI'),'de  à ','')||replace(' soit <b>'||(select trunc(((suivi_datefin-suivi_datedebut)*24))||'h'||round( ( (((suivi_datefin-suivi_datedebut)*24)-trunc((suivi_datefin-suivi_datedebut)*24))*60 ) ) from dual)||'min</b>',' soit <b>hmin</b>','')
    from planning

  11. #11
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    OK, alors vas-y comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select to_date(to_char(timestamp2,'ddmmyyyy')) - to_date(to_char(timestamp1,'ddmmyyyy')) from ma_table ;
    le but est transformer ton timestamp d'abors en char, format ddmmyyyy puis à nouveau en date...
    J'obtiens cette fois-ci l'erreur suivante : le littoral ne concore pas avec le format chaîne de caractère ...

    Je ne comprends pas, j'avais pensé à cette requête qui paraît pourtant logique...

  12. #12
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Voici un code qui semble donner le résultat escompté....
    ... mais pas très académique !

    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
    SQL> set serveroutput on
    SQL> DECLARE
      2     date1  TIMESTAMP(3);
      3     date2  TIMESTAMP(3);
      4     date3  date ;
      5  BEGIN
      6     date1  := sysdate;
      7     date2 := sysdate + 1;
      8     dbms_output.put_line( Substr(to_char(date2 - date1),1, 1) || Ltrim(Substr(to_char(date2 - date1),2, 10),'0')  ) ;
      9  END;
     10  /
    +1
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>

  13. #13
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Tes champs sont bien de type date ?
    Non Marsup54, mes champs sont au format timestamp, c'est pour ça que je bataille...

    J'ai essayé ta requête j'otiens l'erreur "attendu != obtenu"...

  14. #14
    Membre confirmé
    Inscrit en
    Avril 2003
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Avril 2003
    Messages : 288
    Par défaut
    Question toute bête : Ta base est dans quelle langue !!!

    Vérifie tes formats !!!

  15. #15
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Tout est en français !! Mais c'était bien tenté !

  16. #16
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    une simple question... tu es sur quelle version d'Oracle ? avec quels NLS parameters ?

  17. #17
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    SheikYerbouti,
    J'ai essayé d'adapter ton code à mon cas, mais le pb, c'est que j'ai jamais encore de pl/sql ; voici ce que j'ai appliqué :

    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
    set serveroutput on;
    declare
    date1  TIMESTAMP(3); 
    date2  TIMESTAMP(3); 
     
    begin
    select EVE_DATE_RDV,EVE_DATE_CREATION
    into date1,date2
        from "GEXWIN"."EVE_SUIVI" 
        where DIV_CODE_SOURCE=92 
        AND DOS_GEX_NUMERO_DOSSIER=00000002
        AND DOS_GEX_ANNEE=2003
        AND EVE_COMPTEUR=4;
     
        dbms_output.put_line( Substr(to_char(date2 - date1),1, 1) || Ltrim(Substr(to_char(date2 - date1),2, 10),'0')  ) ; 
     
    end;
    une fois ce code éxecuté, j'obtiens l'erreur suivante : ORA00922 : option erronée ou absente.
    aurais-je fais une faute voire plusieurs ? voire ça n'a aucun sens !? ^^

    Merci de ton aide en tous cas !

  18. #18
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    erreur sur quelle ligne ?

    pouvez-vous afficher le DESC de cette table ?

  19. #19
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    à mon avis il n'aime pas les doubles quotes sur les noms des tables...

  20. #20
    Membre averti
    Inscrit en
    Décembre 2003
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 38
    Par défaut
    Je suis sur oracle 9.2 et les parametre NLS sont les paramètres par défaut.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Soustraction de deux requetes SQL
    Par mallsoul dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/12/2012, 13h13
  2. Réponses: 5
    Dernier message: 26/05/2009, 17h54
  3. Réponses: 8
    Dernier message: 29/09/2006, 18h09
  4. [Oracle / Sql] Et logique entre deux bits
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 5
    Dernier message: 15/03/2005, 14h35
  5. [Date] Soustraction de deux dates ?
    Par Invité dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 29/03/2004, 11h54

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