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 :

Soustraction de date


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut Soustraction de date
    Bien le bonjour à tous !

    Je viens solliciter votre aide.

    Je suis en train de mettre un place un outil de statistiques dans mon entreprise en PHP/Oracle.

    Le projet est presque terminé, cependant je me prend sévèrement la tête sur certaines requêtes lié à des champs "date".

    Voila ce que je dois faire:

    Je dois calculer le délai d'ouverture d'un dossier mais en faisant une soustraction du temps ou le dossier à été mis en "Pending".

    Donc pour récupérer le délai total dans un premier temps je fais un simple date_debut - date_fin, ce qui me retourne une durée en 0,45245454.

    Ce résultat j'arrive à le transformer en 'minutes' ou 'heures + minutes' ou 'jour + heure + min'.

    Ces deux champs sont au format DATE > DD/MM/YYYY HH24:MM:SS

    Ma problèmatique réside dans le fait que je dois ensuite soustraire à cette durée une durée de pendind qui est au format DATE mais qui ressemble à ceci : 1 00:00:00 => Qui correspond à 1 journée.

    La finalité est de trouver un temps total d'ouverture inférieur à une duréé prédéfini :

    (date_debut - date_fin) - temps_pending < 'durée en minutes'

    Je ne vous cache pas que je me prend bien la tête la dessus.
    Si quelqu'un aurait une idée j'en serait extrement ravi

    Merci à tous et bon week end.

    ----------
    Tutomania
    ----------

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    La durée de votre pending est au format INTERVAL DAY TO SECOND.
    Vous pouvez tout à fait convertir une différence de date à ce format là, et ensuite faire la soustraction.

    Il suffit ensuite de faire la comparaison avec votre durée en minutes, convertie elle aussi en intervale.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    select
        (dt_fin - dt_deb) DAY TO SECOND - pending as duree_eff,
        duree_type,
        case when (dt_fin - dt_deb) DAY TO SECOND - pending < duree_type then 'OK' else 'KO' end u
    from -- ce from est pour que les formules du dessus soient plus simples à lire
    (    
        select
            to_date('13/02/2009 12:40:00', 'dd/mm/yyyy hh24:mi:ss') dt_fin,
            to_date('12/02/2009 11:22:00', 'dd/mm/yyyy hh24:mi:ss') dt_deb,
            INTERVAL '1 00:00:00' DAY TO SECOND pending,
            INTERVAL '90' MINUTE duree_type 
        from dual    
    )

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Ah voilà j'ai retrouvé les fonctions de conversion qui me manquaient, c'est NUMTODSINTERVAL et TO_DSINTERVAL :
    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
    select
        (dt_fin - dt_deb) DAY TO SECOND - TO_DSINTERVAL(pending) as duree_eff,
        NUMTODSINTERVAL(duree_num, 'MINUTE') duree_typ,
        case
          when (dt_fin - dt_deb) DAY TO SECOND - TO_DSINTERVAL(pending) < NUMTODSINTERVAL(duree_num, 'MINUTE')
          then 'OK' else 'KO'
        end u
    from -- ce from est pour que les formules du dessus soient plus simples à lire
    (    
        select
            to_date('13/02/2009 12:40:00', 'dd/mm/yyyy hh24:mi:ss') dt_fin,
            to_date('12/02/2009 11:22:00', 'dd/mm/yyyy hh24:mi:ss') dt_deb,
            '1 00:00:00' pending,
            90 duree_num
        from dual
    )

  4. #4
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Merci beaucoup pour ta réponse Waldar.
    J'essaye tout ça dès que possible et te reviens.

    En tous les cas merci pour cette réponse rapide et claire.

    Bon week end.

  5. #5
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Rebonjour à tous, je me suis replongé dans le code et ça va pas de tout du tout

    Bon et bien en fait c'est beaucoup plus compliqué que ça, attention les yeux on ne rigole plus la

    Voila ce que je dois faire :

    Compter le nombre d'incidents résolu dans les temps en soustrayant les délais de suspension de chaque incidents (plusieurs délai de suspension possible par incident).

    Voila ce que j'ai réussi à faire pour le moment, c'est compter le nombre d'incidents dont le TOTAL_TIME - LE PENDING , le tout transformer en minutes et < à une durée donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select count(NUMBERPRGN) as total from (SELECT  PROBSUMMARYM1.NUMBERPRGN,(nvl(to_number((EXTRACT(MONTH FROM c2.CLOSED_TOTAL)-1 )*40500)+((EXTRACT (DAY FROM c2.CLOSED_TOTAL)-1)*1350)+((EXTRACT (HOUR FROM TO_TIMESTAMP( TO_CHAR (c2.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )))*60) +EXTRACT (MINUTE FROM TO_TIMESTAMP(TO_CHAR (c2.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )),0)  
    - -- <-- C'est un moins (-)
    nvl(to_number((EXTRACT(MONTH FROM c4.CLOSED_TOTAL)-1 )*40500)+ ((EXTRACT (DAY FROM c4.CLOSED_TOTAL)-1)*1350)+((EXTRACT (HOUR FROM TO_TIMESTAMP( TO_CHAR (c4.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )))*60) +EXTRACT (MINUTE FROM TO_TIMESTAMP(	TO_CHAR (c4.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )),0) 
     
    ) as TOT FROM servicec.PROBSUMMARYM1 left join servicec.CLOCKSM1 c2 on PROBSUMMARYM1.NUMBERPRGN = c2.KEY_CHAR and c2.NAME='Total temps passé' left join 
     
    servicec.CLOCKSM1 c4 on PROBSUMMARYM1.NUMBERPRGN = c4.KEY_CHAR and c4.NAME =  'GROUPE-Pending'
     
    where PROBSUMMARYM1.CLOSE_TIME IS NOT NULL 
    And priority_code ='4' and cly_group_suivi_hd = 'SERVICE DESK' AND 
    PROBSUMMARYM1.CLOSE_TIME between '01/02/2009' AND '28/02/2009' and (c2.name is not null or c4.name is not null)) where tot < 840
    La grosse problèmatique est qu'il peut y avoir dans la table clocksm1 plusieurs enregistrements de type pending. Il faut donc que j'additionne tous les enregistrements Like '%-Pending' pour chaque incident et le soustraire à son total_time.

    Ma question est comment additionner tous les pendings pour chaque incident ?

    Le casse tête de fou !!!

    les deux tables sont ProbsummaryM1 pour les incidents et clocksM1 pour les délais. La liaison entre les deux tables est le champ numberprgn de Probsummary et key_char de clocksM1.

    Dans clocksM1 il y a un champ qui se nomme 'name' dans lequel on va retrouver une ligne pour "Total temps passé" et une ou plusieurs lignes pour les -Pending ('%-Pending')

    Exemple :

    KEY_CHAR | NAME | CLOSED_TOTAL
    IM10XXX | Total Temp passé | 1 00:00:00
    IM10XXX | groupe_Pending | 14:00:00
    IM10XXX | groupe1_Pending | 3:00:00
    IM10ZZZ | groupe2_Pending | 3:00:00


    Par exemple ci dessus pour IM10XXX on a un Total temps passé de 1 journée et deux entrées %-Pending (14h + 3h donc 17h)
    Total Temp passé - (groupe_Pending+groupe1_Pending) = 7 heures

    A l'AIDDDEEEEEE !! HELP

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Houla, déjà on reformate un peu la requête car c'est illisible :
    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
    SELECT
        count(num) AS total
    FROM
    (
        SELECT
            p1.NUMBERPRGN,
            (nvl(to_number((EXTRACT(MONTH FROM c2.CLOSED_TOTAL)-1 )*40500)+((EXTRACT (DAY FROM c2.CLOSED_TOTAL)-1)*1350)+((EXTRACT (HOUR FROM TO_TIMESTAMP( TO_CHAR (c2.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )))*60) +EXTRACT (MINUTE FROM TO_TIMESTAMP(TO_CHAR (c2.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )),0)  
             - -- <-- C'est un moins (-)
             nvl(to_number((EXTRACT(MONTH FROM c4.CLOSED_TOTAL)-1 )*40500)+((EXTRACT (DAY FROM c4.CLOSED_TOTAL)-1)*1350)+((EXTRACT (HOUR FROM TO_TIMESTAMP( TO_CHAR (c4.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )))*60) +EXTRACT (MINUTE FROM TO_TIMESTAMP(TO_CHAR (c4.CLOSED_TOTAL, 'DD/MM/YY HH24:MI:SS'), 'DD/MM/YY HH24:MI:SS' )),0) 
            ) AS TOT
        FROM
            servicec.PROBSUMMARYM1 p1
            LEFT JOIN servicec.CLOCKSM1 c2
              ON p1.numberprgn = c2.key_char
             AND c2.NAME = 'Total temps passé'
            LEFT JOIN servicec.CLOCKSM1 c4
              ON p1.numberprgn = c4.key_char
             AND c4.name = 'GROUPE-Pending'
        WHERE
            p1.close_time IS NOT NULL 
        AND priority_code ='4'
        AND cly_group_suivi_hd = 'SERVICE DESK'
        AND p1.close_time BETWEEN '01/02/2009' AND '28/02/2009'
        and (c2.name is not null or c4.name is not null)
    )
    WHERE
        tot < 840
    Vous faites des to_number sur des nombres. Soit, mais c'est inutile.
    Vous convertissez une date en texte puis en timestamp pour faire un extract.
    Extract fonctionne déjà sur les dates.

    D'où sortent votre *40500 sur un mois ?
    Si ce sont des minutes, ça fait des mois de 28.125 jours, ce qui est bien évidement faux, ce qui rend votre requête fausse.

    CLOSED_TOTAL de la table CLOCKSM1 est de quel type, date ?
    Pour éviter toute interprétation merci de copier / coller le script DDL de cette table !

  7. #7
    Membre confirmé Avatar de tutomania
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    68
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 68
    Par défaut
    Bonsoir Waldar.

    Alors voici les réponses que tu attends (enfin j'espère).

    D'où sortent votre *40500 sur un mois ?
    En fait c'est basé sur un Calendrier spécial et non un calendrier grégorien
    une journée c'est 14h (de 7h à 21h) et non 24h.

    CLOSED_TOTAL de la table CLOCKSM1 est de quel type, date ?
    Nom du champ - Type
    closed_total - Date/Time

    Pour éviter toute interprétation merci de copier / coller le script DDL de cette table !
    Je ne sais pas ce que c'est

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

Discussions similaires

  1. soustraction de date
    Par lazzeroni dans le forum Oracle
    Réponses: 4
    Dernier message: 04/07/2006, 12h27
  2. [Dates] Soustraction...de date
    Par BenoitDenis dans le forum Langage
    Réponses: 7
    Dernier message: 24/04/2006, 13h48
  3. [Dates] Soustraction de date en php
    Par o_live dans le forum Langage
    Réponses: 1
    Dernier message: 28/11/2005, 15h25
  4. arrondir un nombre découlant d'une soustraction de date
    Par bertrand_declerck dans le forum Langage
    Réponses: 2
    Dernier message: 17/08/2005, 13h51
  5. Problème de soustraction de date
    Par remika dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/07/2005, 14h51

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