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

PL/SQL Oracle Discussion :

Opérations sur des heures


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut Opérations sur des heures
    Bonjour à tous,

    Je vous expose mon problème :

    j'ai une table avec des heures au format hh:mm:ss (colonnes de type varchar2) et j'aimerais faire des soustractions d'heures basiques du genre :

    06:20:00-05:10:00 = 70:00 en gros (je passe du format hh:mm:ss au format mm:ss).

    Mon problème est que je ne suis pas sur 24h mais sur 25 ou 26 (je peux avoir des heures du type 26:42:12 par exemple).

    Actuellement, je transforme donc mes heures en secondes à coup de to_number(substr(heure,1,2)*3600 + substr(...)), je fais ma soustraction et je reconvertis en format mm:ss à coup de to_char(floor(secondes/60)) || ':' || to_char(mod(secondes,60))...

    Ca marche, mais sachant que j'aimerais faire cette soustraction directement dans le Select de ma requete, cela me fait beaucoup de blabla pour pas grand chose au final.

    Quelqu'un aurait-il une solution plus élégante ou cela n'est-il tout simplement pas possible?

    Merci d'avance pour vos réponses.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous pouvez travailler avec le type INTERVAL, mais ça demande quelques manipulations qui au final ne seront pas forcément beaucoup plus simple que ce que vous avez là.

    Compte-tenu que vos heures peuvent dépasser 24, je n'ai trouvé que le format ISO pour convertir.
    Ensuite la soustraction est simple, mais il faut encore reconvertir le résultat dans une chaîne de caractères.

    Je détaille ici toutes les manipulations :
    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
    With SR1 as
    (
    select '26:42:12' as it1, '06:20:00' as it2 from dual
    )
      ,  SR2 as
    (
    select 'P0DT' || substr(it1, 1, 2) || 'H' || substr(it1, 4, 2) || 'M' || substr(it1, -2) || 'S' as itv1
         , 'P0DT' || substr(it2, 1, 2) || 'H' || substr(it2, 4, 2) || 'M' || substr(it2, -2) || 'S' as itv2
      from SR1
    )
      ,  SR3 as
    (
    select to_dsinterval(itv1) - to_dsinterval(itv2) as itv_diff
      from SR2
    )
    select to_char(24 * 60 * extract(day    from itv_diff)
                 + 24 *      extract(hour   from itv_diff)
                 +           extract(minute from itv_diff), 'fm99900')
           || ':' ||
           to_char(extract(second from itv_diff), 'fm00') as "MM:SS"
      from SR3;
    À votre place, je garderai vos transformations et je les collerai dans une vue, ça devient transparent pour la suite du select.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 12
    Points : 10
    Points
    10
    Par défaut
    Merci pour votre réponse, ce n'est effectivement pas vraiment plus simple
    Par contre je n'avais pas pensé à la vue, qui serait une solution intermédiaire. Je vais voir si je peux me diriger dans ce sens.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Tu peux mettre tout ton calcul dans le select, sinon, une petite fonction ferait la même chose

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT deb, fin,
           TRUNC((  TO_NUMBER(SUBSTR(fin, 1, 2)) * 3600 + TO_NUMBER(SUBSTR(fin, 4, 2)) * 60 + TO_NUMBER(SUBSTR(fin, 7,2)) 
           - TO_NUMBER(SUBSTR(deb, 1, 2)) * 3600 - TO_NUMBER(SUBSTR(deb, 4, 2)) * 60 - TO_NUMBER(SUBSTR(deb, 7,2))
           ) / 60) ||':'|| 
           LPAD(MOD(TO_NUMBER(SUBSTR(fin, 1, 2)) * 3600 + TO_NUMBER(SUBSTR(fin, 4, 2)) * 60 + TO_NUMBER(SUBSTR(fin, 7,2)) 
           - TO_NUMBER(SUBSTR(deb, 1, 2)) * 3600 - TO_NUMBER(SUBSTR(deb, 4, 2)) * 60 - TO_NUMBER(SUBSTR(deb, 7,2))
           , 60), 2, '0')        
           AS diff
    FROM (SELECT '05:10:00' AS deb, '06:20:00' AS fin FROM dual
    UNION SELECT '05:10:10', '26:20:00'  FROM dual)
     
    DEB	FIN			DIFF
    05:10:00	06:20:00	70:00
    05:10:10	26:20:00	1269:50

Discussions similaires

  1. opération sur des champs déjà manipulés
    Par fred23195 dans le forum SQL Procédural
    Réponses: 10
    Dernier message: 23/08/2006, 16h16
  2. [Dates] Question pour opérations sur des heures
    Par Sangdrax1604 dans le forum Langage
    Réponses: 7
    Dernier message: 23/08/2006, 11h07
  3. [XSL] Calcul sur des heures
    Par pilz dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/03/2006, 13h55
  4. calcul sur des heures
    Par pascale86 dans le forum Access
    Réponses: 5
    Dernier message: 22/12/2005, 16h22
  5. Opération sur des heures dans Excel
    Par mirascheat dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/12/2005, 10h34

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