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

Oracle Discussion :

[Oracle 8i]Sommer des temps


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut [Oracle 8i]Sommer des temps
    Bonjour,

    Je voudrais sommer des temps (du type heure:minute:seconde).
    J'ai un champ TEMPS en varchar. Je n'ai plus de pb pour le passer en date mais je n'arrive pas à réaliser des sommes avec. J'ai essayé différentes solutions (avec le format de date julian, mais ça ne gère que les jours). Je n'arrive pas à utiliser la fonction TIMESTAMP qui serait, a priori, la plus adaptée à mon problème.

    Je voudrais avoir une requête du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select jour, sum(TEMPS)
    from X
    group by jour
    Mais évidemment le sum ne fonctionne pas aussi simplement !
    Merci de me donner des astuces

  2. #2
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Tu convertis ton TEMPS en secondes, tu sommes, et tu reconvertis en heures, minutes, secondes.

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    J'ai finalement réussi à avoir le temps en seconde avec le sql suivant :

    select date_jour,
    sum(to_number(to_char(to_date(substr(temps_com,7,2),'SS'),'SS')))
    + sum(to_number(to_char(to_date(substr(temps_com,4,2),'Mi'),'MI'))) *60
    + sum(to_number(to_char(to_date(substr(temps_com,1,2),'hh24'),'hh24')))*3600 as temps
    from com_det
    group by date_jour
    Un peu lourd comme écriture, mais je ne vois pas d'autres moyens.

    Cependant, je n'arrive pas à retransformer à retransformer le format en date.
    J'ai essayé avec :
    select date_jour, to_char(
    to_date(
    (sum(to_number(to_char(to_date(substr(temps_com,7,2),'SS'),'SS'))) +
    sum(to_number(to_char(to_date(substr(temps_com,4,2),'Mi'),'MI')))*60 +
    sum(to_number(to_char(to_date(substr(temps_com,1,2),'hh24'),'hh24')))*3600
    ),'hh24:mi:ss')
    ,'hh24:mi:ss') as temps
    from im_telephonie_p.com_det
    group by date_jour
    mais ça me met l'erreur suivante :
    ORA-01850: les heures doivent être comprises entre 0 et 23...
    Y'a-t-il un moyen pour avoir le nombre d'heures totales même si cela dépasse 23 ?

    Merci !

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    impossible de faire un TO_DATE sur une durée

    une durée s'exprime en chiffre et non en date... 27 jours ça fait quel date : 27/01/2000, 31/12/1983, ... ?

    le SELECT est faux... qu'est ce que tu veux exactement ? Le temps passer au total ? Pourquoi ne pas faire : date derniere ligne - date 1° ligne ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est pour des tableaux de bord pour de la téléphonie. J'ai un fichier initial avec les durées de communication par appel, et j'aimerai avoir un total de durée de communication par jour.

    Par exemple, j'ai dans mon fichier initial :

    Appel 1 - 10/07/2005 - 04:00
    Appel 2 - 10/07/2005 - 01:00
    Appel 3 - 11/07/2005 - 02:00

    et je veux avoir dans ma table oracle :

    10/07/2005 - 05:00
    11/07/2005 - 02:00

    mais pour l'instant j'ai :
    10/07/2005 - 400
    11/07/2005 - 120

    J'arrive donc à avoir mon temps de communication en secondes, mais j'ai besoin de le formater pour que ce soit facilement interprétable.

    Voilà, merci encore

  6. #6
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Je ferais plutôt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT date_jour, 
       TO_CHAR(TRUNC((TO_NUMBER(substr(temps_com,7,2)) + TO_NUMBER(substr(temps_com,4,2)) * 60 + TO_NUMBER(substr(temps_com,1,2)) * 3600)/3600))
    || ':'
    || TO_CHAR(TRUNC((MOD(TO_NUMBER(substr(temps_com,7,2)) + TO_NUMBER(substr(temps_com,4,2)) * 60 + TO_NUMBER(substr(temps_com,1,2)) * 3600), 3600))/60))
    || ':'
    || TO_CHAR(MOD(TO_NUMBER(substr(temps_com,7,2)) + TO_NUMBER(substr(temps_com,4,2)) * 60 + TO_NUMBER(substr(temps_com,1,2)) * 3600), 60))
    FROM com_det 
    GROUP BY date_jour
    L'idée est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date_jour, 
       TO_CHAR(TRUNC(DureeSecondes/3600)) || ':'
    || TO_CHAR(TRUNC(MOD(DureeSecondes, 3600)/60)) || ':'
    || TO_CHAR(MOD(DureeSecondes, 60))
    FROM com_det 
    GROUP BY date_jour
    Pas le courage de vérifier les parenthèses, c'est un miracle si elles sont correctes

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    SQL> create table ma_table (date_jour varchar2(15), duree varchar2(5));
     
    Table créée.
     
    SQL> insert into ma_table values ('10/07/2005','04:00');
     
    1 ligne créée.
     
    SQL> insert into ma_table values ('10/07/2005','03:20');
     
    1 ligne créée.
     
    SQL> insert into ma_table values ('10/07/2005','02:00');
     
    1 ligne créée.
     
    SQL> insert into ma_table values ('10/07/2005','04:00');
     
    1 ligne créée.
     
    SQL> insert into ma_table values ('10/07/2005','92:21');
     
    1 ligne créée.
     
    SQL> select date_jour,
      2         TRUNC(duree_sec/3600) heures,
      3         TRUNC((duree_sec/60) - 60*TRUNC(duree_sec/3600)) minutes,
      4         duree_sec 
      5            - 3600*TRUNC(duree_sec/3600) -- enleve les heures entières
      6            - 60*TRUNC((duree_sec/60) - 60*TRUNC(duree_sec/3600)) -- enleve les minutes entières
      7              as secondes
      8        from (
      9              SELECT date_jour, SUM(SUBSTR(duree,1,2)) * 60 + SUM(SUBSTR(duree,4,2)) duree_sec 
     10              FROM ma_table
     11              group by date_jour
     12              );
     
    DATE_JOUR           HEURES    MINUTES   SECONDES
    --------------- ---------- ---------- ----------
    10/07/2005               0          9         20
    11/07/2005               1         36         21

  8. #8
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Tu sais que dans des problèmatique comme celles-là, il est très courant de conserver pour chaque appel la durée en seconde (même si ça fait double emploi avec ton champ VARCHAR) pour se faciliter la vie lors des statistiques et du reporting.

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est ce que je compte faire ! Mais j'ai quand même besoin, à un moment, de présenter mon temps en seconde avec un format lisible. J'utilise comme outil de reporting BO, et j'ai les mêmes problèmes que sous oracle qui ressortent.

    Mais déjà merci pour vos réponses, j'ai un temps en seconde, c'est déjà pas mal

  10. #10
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    je t'ai même donné le temps en heure, minute, seconde

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Oui, je viens de tester, c'est nickel merci !

    Par contre, sous BO, c'est pas encore ça...

    Je vous laisse tranquille, je vais essayer de faire fonctionner tout ça !


  12. #12
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Je ne comprend pas trop ton problème là ...

    Tu veux quoi exactement ???? Si tu as ton temps en secondes et en date, tu peux faire ce que tu veux !! Avec ce qu'à donné Orafrance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    TRUNC(duree_sec/3600) heures, 
      3         TRUNC((duree_sec/60) - 60*TRUNC(duree_sec/3600)) minutes, 
      4         duree_sec 
      5            - 3600*TRUNC(duree_sec/3600) -- enleve les heures entières 
      6            - 60*TRUNC((duree_sec/60) - 60*TRUNC(duree_sec/3600)) -- enleve les minutes entières 
      7              as secondes
    Il te suffit de mettres des pour avoir ta somme dans un format HH:mm:ss

    Sinon, si tu es sous BO, tu fais comme tout le monde et tu te fais une variable qui calcule ce que tu veux à partir du nombre total de secondes.

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    BO n'est pas capable de restituer le résultat d'une vue ?

  14. #14
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    ? Euh si, mais je suis pas sûr que le problèm venait de là...

    En tous cas les vues sont un moyen de contourner les limitations de BO. Cependant bourrer sa base de vue risque de rendre BO moins maintenable, donc on l'utilise avec prudence.

  15. #15
    Futur Membre du Club
    Inscrit en
    Avril 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Oui effectivement BO peut travailler sur des vues.

    Mais je ne suis pas sure pour autant que ça me facilite le travail que d'en constituer. Le schéma de l'univers risque d'être illisible ensuite...

    Merci pour votre aide, je pense que je suis sur la bonne voie

  16. #16
    Membre émérite Avatar de nuke_y
    Profil pro
    Indépendant en analyse de données
    Inscrit en
    Mai 2004
    Messages
    2 076
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant en analyse de données

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 076
    Points : 2 370
    Points
    2 370
    Par défaut
    Les vues on les utilise plutôt pour les aggégats. Genre si tu dois sortir des aggrégations un peu compliquée sur 2 ou 3 dimensions, tu crées une vue et tu requête simplement dessus. Ca évite de faire 15 fournisseurs de données avec des variables.

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

Discussions similaires

  1. Sommer des temps en java (non pas des dates)
    Par papse dans le forum Langage
    Réponses: 3
    Dernier message: 16/04/2010, 19h03
  2. [Oracle] Sommer des montants de devises différentes
    Par ben53 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/11/2006, 15h08
  3. [Oracle - SQL] Désactivation des contraintes d'inégrités.
    Par mika0102 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/07/2005, 12h59
  4. [ORACLE 9i] Gestion des exceptions
    Par sygale dans le forum SQL
    Réponses: 6
    Dernier message: 19/08/2004, 16h06

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