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

DB2 Discussion :

Calcul de délai entre deux dates


Sujet :

DB2

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Calcul de délai entre deux dates
    Bonjour, je souhaiterai calculer un délai entre deux dates, obtenir le nombre de jours ouvrés entre ces deux dates, c'estàdire sans les week end. Existe-t-il une fonction qui pourrait me permettre de faire ça ou un calendrier db2 que je pourrais utiliser pour avoir la notion de jours ouvrés ?
    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Salut,

    Le problème de jours ouvrés, c'est qu'il y a aussi des jours fériés, jours fériés nationaux voire propres à l'entreprise.
    Le mieux est de créer un calendrier pour ce faire et de requêter dessus.
    Dans le code ci-dessous, je créé une fonction SQL Ferie qui recoit une date et renvoie un libelle du nom du jour ferie. Elle va nous servir à initiliser un calendrier.
    Dans le second code, il s'agit d'une procédure stockée qui créé une table CALEND entre le 01.01.1990 et le 31.12.2039.
    La table contient 3 zones.
    - La date
    - Le type de Jour ('O' = Ouvrable, 'F' = Ferie, 'S' = Samedi, 'D' = Dimanche.
    - Le libellé du jour ferie.

    Pour executer ce code et créer la fonction et la procédure, sois tu utilises Les scripts dans Navigator, soit tu mets le code dans un source et tu l'éxécutes avec un RUNSQLSTM commit(*NONE)

    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    create function QGPL/ferie(inpDate date) returns char(15)
    language sql                                              
    deterministic                      
    Disallow Parallel                       
    no external action                                        
    Returns NULL on NULL Input
    Begin                                                     
      Declare A dec(5, 0);                                    
      Declare B dec(5, 0);                                    
      Declare C dec(5, 0);                                    
      Declare P dec(5, 0);                                    
      Declare E dec(5, 0);                                    
      Declare F dec(5, 0);                                    
      Declare G dec(5, 0); 
      Declare H dec(5, 0); 
      Declare I dec(5, 0); 
      Declare K dec(5, 0); 
      Declare R dec(5, 0); 
      Declare N dec(5, 0); 
     
      Declare Jour dec(2, 0);
      Declare Mois dec(2, 0);
      Declare An dec(4, 0);
     
      Declare D dec(5, 0);
      Declare M dec(5, 0);
     
      Declare Paques date;
      Declare Delta_Paques dec(5, 0);
     
    Set Jour = Day(inpDate);
    Set Mois = Month(inpDate);
    Set An   = Year(inpDate);
     
    -- Calcul du dimanche de Pâques
    Set A    = MOD(An, 19);
    Set B    = INT(An / 100);          
    Set C    = MOD(An, 100);          
    Set P    = INT(B / 4);          
    Set E    = MOD(B, 4);          
    Set F    = INT((B+8) / 25);          
     
    Set G    = INT((B-F+1) / 3);         
    Set H    = MOD((19*A)+(B-P-G+15), 30);
    Set I     = INT(C / 4);
     
    Set K    = MOD(C, 4);
    Set R    = MOD(32+(2*E)+(2*I)-H-K, 7);
    Set N    = INT((A+11*H+22*R) / 451);
     
    -- M=mois de Pâques            
    -- D=Jour de Pâques            
    Set M    = INT((H+R-7*N+114) / 31);
    Set D    = MOD(H+R-7*N+114, 31)+1;
     
    -- On fabrique la date de Dimanche de Pâques
    Set Paques =  date(right('0' concat trim(char(D)), 2) concat '.'
                      concat right('0' concat trim(char(M)), 2)  concat '.' 
                      concat trim(char(AN)));
     
     
    -- On Calcule le delta entre la date envoyée et Paques
    Set Delta_Paques = DAYS(InpDate) - DAYS(Paques);
     
    -- Renvoie du jour férié
     
    CASE                           
       when (jour=01 and mois=01)    
          Then Return 'Jour de l''an';  
       when (jour=01 and mois=05)    
          Then Return 'Fête du Travail';
       when (jour=08 and mois=05)    
          Then Return 'Armistice 39-45';
       when (jour=14 and mois=07)    
          Then Return 'Fête Nationale'; 
       when (jour=15 and mois=08)    
          Then Return 'Assomption';     
       when (jour=01 and mois=11)    
          Then Return 'Toussaint';       
       when (jour=11 and mois=11)     
          Then Return 'Armistice 14-18'; 
       when (jour=25 and mois=12)     
          Then Return 'Noël';            
       when (Delta_Paques=1)          
          Then Return 'Lundi de Pâques'; 
       when (Delta_Paques=39)         
          Then Return 'Ascension';       
       when (Delta_Paques=50)   
          Then Return 'Pentecôte'; 
       else Return ''; 
    END CASE;
     
    END
    ;
    -------------------------------------------------------------
    create procedure QGPL/Calendrier
    language sql modifies sql data                                              
    Begin                                                     
      Declare wcDate Date;                                    
      Declare wType char(1);
      Declare wlFerie char(15);
      Declare jour int;
     
    -- Creation d'une table Calendrier
      CREATE TABLE QGPL/CALEND ( CDATE DATE NOT NULL, TYPE CHARACTER (1) NOT NULL, LFERIE CHAR (15) NOT NULL, PRIMARY KEY (CDATE)  );
     
      SET wCDate = date('01.01.1990')
    ;
      WHILE wCDate <= Date('31.12.2039') DO
     
        Set wlFerie = Ferie(wcDate);
        Set jour = dayofweek_iso(wCdate);
        Case 
          When trim(wlFerie)<>'' Then Set wType = 'F';
          When Jour= 6 Then Set wType = 'S';
          When Jour = 7 Then Set wType = 'D';
          Else Set wType = 'O';
        End Case;
        INSERT INTO QGPL/CALEND VALUES(wCDate, wType, wlFerie);  
        SET wCDate = wCDate + 1 Days;
      END WHILE;
    END
    Une fois créé, dans STRSQL tu fais un CALL CALENDRIER.
    La table CALEND sera créée dans QGPL.
    Maintenant si tu veux connaître le nombre de jours ouvrables en mai 2009 par exemple, tu peux l'avoir par la requête ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select count(*) from calend                      
    where cdate between '01.05.2009' and '31.05.2009'
    and Type = 'O'
    Résultat = 18

    Si tu veux connaître le jour d'une date tu n'as pas besoin de fonctions :
    Select Dayofweek_iso(madate) from xxxxxx

    Tu peux même utiliser la fonction Ferie() par la suite :
    Select Ferie(madate) from xxxxxx
    Renverra un libelle si le jour est férié, mais cette fonction ne tient pas compte des jours fériés propres à l'entreprise.

    Ci-dessous la liste des jours non ouvrables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select * from calend                             
    where cdate between '01.05.2009' and '31.05.2009'
    and not Type = 'O'
    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CDATE       TYPE  LFERIE          
    2009-05-01   F    Fête du Travail 
    2009-05-02   S                    
    2009-05-03   D                    
    2009-05-08   F    Armistice 39-45 
    2009-05-09   S                    
    2009-05-10   D                    
    2009-05-16   S                    
    2009-05-17   D                    
    2009-05-21   F    Ascension       
    2009-05-23   S                    
    2009-05-24   D                    
    2009-05-30   S                    
    2009-05-31   D

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 42
    Points : 31
    Points
    31
    Par défaut
    Bonjour

    Moi je n'ai qu'une chose à Dire un Grand MERCI K2R400. pour la réponse

    Et aussi à toi bouchoc pour l'avoir posé.

    Moi j'en ai fait une fonction.

  4. #4
    Membre actif
    Inscrit en
    Juin 2008
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Juin 2008
    Messages : 154
    Points : 225
    Points
    225
    Par défaut
    Bonjour,

    Au cas où ton seul besoin serait les week-end sans tenir compte des jours fériés, alors cette requête devrait fonctionner

    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
    SELECT (DAYS(COLDAT1) - DAYS(COLDAT2))             
         - ((DAYS(COLDAT1) - DAYS(COLDAT2)) / 7) * 2   
         - CASE                                        
              WHEN DAYOFWEEK_ISO(COLDAT1)              
                 = DAYOFWEEK_ISO(COLDAT2)        THEN 0
              WHEN DAYOFWEEK_ISO(COLDAT1)              
                 < DAYOFWEEK_ISO(COLDAT2)              
               AND DAYOFWEEK_ISO(COLDAT2) ^= 7   THEN 2
              WHEN DAYOFWEEK_ISO(COLDAT1)              
                 < DAYOFWEEK_ISO(COLDAT2)              
               AND DAYOFWEEK_ISO(COLDAT2) = 7    THEN 1
              WHEN DAYOFWEEK_ISO(COLDAT1) = 7    THEN 1
              ELSE                                    0
           END                                         
    FROM   TABLE
    A ta disposition et bonne utilisation.

Discussions similaires

  1. [2008] Calculer un délai entre deux dates
    Par Chris L' Arabis dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 31/07/2014, 19h21
  2. Calculer la différence entre deux dates
    Par drthodt dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 18/12/2007, 08h27
  3. calcul délais entre deux dates avec plages horaires
    Par leila eco dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 03/01/2007, 16h51
  4. Requête pour calculer le temps entre deux dates
    Par Badboy62cfp dans le forum Access
    Réponses: 2
    Dernier message: 19/05/2006, 13h50
  5. [VBA] Calculer la différence entre deux dates
    Par T'chab dans le forum Access
    Réponses: 13
    Dernier message: 11/05/2006, 15h12

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