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 :

[DB2 / AS400 - V5R4] Récupération des données de la veille et du jour


Sujet :

DB2

  1. #1
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut [DB2 / AS400 - V5R4] Récupération des données de la veille et du jour
    Bonjour à tous,

    Suite de ce post.

    Je désire désormais avoir également les résultats de la veille.

    J'ai essayé ceci, mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT champ1 FROM monSchema.maTable 
    WHERE 
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = CURRENT DATE - 1)
      OR
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = CURRENT DATE)

    Merci de m'aider.

    Gôm
    Quand on n'a pas d'tête, on a ...

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Bonjour,

    et ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    CURRENT DATE - 1 DAYS
    Bonne journée

  3. #3
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Bingo !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT champ1 FROM monSchema.maTable 
    WHERE 
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = CURRENT DATE - 1 DAYS)
      OR
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = CURRENT DATE)


    Merci
    Quand on n'a pas d'tête, on a ...

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    Que se passe-t-il si la veille de CURRENT DATE tombe un dimanche ou un jour férié ?

  5. #5
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Citation Envoyé par Mercure Voir le message
    Que se passe-t-il si la veille de CURRENT DATE tombe un dimanche ou un jour férié ?
    Très bonne question, mais dans ces cas là : il n'y aura tout simplement pas de résultat pour la veille.

    Il y a-t-il un moyen pour ne récupérer que les jours ouvrés ?!

    Par exemple, je lance la requête le lundi, alors je récupère les résultats du vendredi et du lundi ?

    Oui, vous l'avez compris le samedi ne m'intéresse pas !


    Gôm
    Quand on n'a pas d'tête, on a ...

  6. #6
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    A tester et à améliorer

    Code SQL : 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
     
    SELECT champ1 FROM monSchema.maTable 
    WHERE 
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = 
     
                CASE dayofweek(CURRENT DATE) 
                   WHEN 7 THEN CURRENT DATE - 1 DAYS --On est samedi, on récupère vendredi
                   WHEN 1 THEN CURRENT DATE - 2 DAYS --On est dimanche, on récupère vendredi
                   WHEN 2 THEN CURRENT DATE - 3 DAYS --On est lundi, on récupère vendredi
                   ELSE DATE - 1 DAYS -- on est un autre jours, on récupère la veille 
                END AS datejour)
      OR
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) = CURRENT DATE)

  7. #7
    Membre averti
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mai 2003
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Mai 2003
    Messages : 921
    Points : 449
    Points
    449
    Par défaut
    Merci beaucoup MaitrePylos ça fonctionne parfaitement !
    Quand on n'a pas d'tête, on a ...

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    C'est bien et juste, mais pour plus de clarté pour nous Européens, j'aurais utilisé la fonction DayOfWeek_ISO() plutôt que DayOfWeek() qui est pratiquée aux E-U.

    Aux E_U, la semaine commence le Dimanche et le Lundi en Europe.

    Avec DayOfWeek(), le dimanche prend la valeur 1, le lundi 2, ... le samedi 7.

    Avec DayOfWeek_ISO(), le lundi prend la valeur 1, le mardi 2, ... le dimanche 7, ce qui est plus cohérent pour nous.

    Je change donc le SQL comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT Champ1, Champ2 FROM monSchema.maTable
      WHERE 
        DATE( SUBSTR(Champ2, 1, 4) CONCAT '-' CONCAT  
              SUBSTR(Champ2, 5, 2) CONCAT '-' CONCAT  
              SUBSTR(Champ2, 7, 2) )
         IN ( CURRENT DATE, 
              CASE dayofweek_ISO(CURRENT DATE)          
                     WHEN 6 THEN CURRENT DATE - 1 DAYS  
                     WHEN 7 THEN CURRENT DATE - 2 DAYS  
                     WHEN 1 THEN CURRENT DATE - 3 DAYS  
                     ELSE CURRENT DATE - 1 DAYS END )
    Et j'ai "remonté" également le test sur l'égalité avec CURRENT_DATE au niveau du prédicat WHERE avec un IN ( ).

    Mais, ça ne suffit pas car on ne tient pas compte des jours fériés tels que le 1er Janvier, le 15 Août ou Noël. La seule façon alors de s'en sortie, c'est d'avoir une table des jours non travaillés dans l'année (ou l'inverse) et de la rapprocher de la table monSchema.maTable.

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Pour résoudre, voici deux fonctions.
    La première te permet de savoir si il s'agit d'un jour férié ou non, il attend une date en entrée et renvoie le libellé du jour férié ou blank dans le cas contraire.

    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
    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
    Deuxième fonction, OuvrableP qui te ramène le prochain jour ouvrable de la date passée en paramètre :

    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
    create function QGPL/OuvrableP(inpDate date) returns Date
    language sql                                              
    deterministic                      
    Disallow Parallel                       
    no external action                                        
    Returns NULL on NULL Input
    Begin                                                     
      Declare wDate Date;                                    
     
     
    SET wDate = InpDate - 1 Days;
    WHILE dayofweek_ISO(wDate) >= 6 or not trim(Ferie(wDate)) = '' DO
       SET wDate = wDate - 1 Days;
    END WHILE;
    Return wDate;
     
    END
    On peut doubler cette fonction avec OuvrableS pour Suivant au lieu de Précédent, dans ce cas celà 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
    15
    16
    17
    create function QGPL/OuvrableS(inpDate date) returns Date
    language sql                                              
    deterministic                      
    Disallow Parallel                       
    no external action                                        
    Returns NULL on NULL Input
    Begin                                                     
      Declare wDate Date;                                    
     
     
    SET wDate = InpDate + 1 Days;
    WHILE dayofweek_ISO(wDate) >= 6 or not trim(Ferie(wDate)) = '' DO
       SET wDate = wDate + 1 Days;
    END WHILE;
    Return wDate;
     
    END
    Une fois ces fonctions créées, si tu veux extraire les enregs du jour et du précédent jour ouvrable tu auras :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT champ1 FROM monSchema.maTable 
    WHERE 
      (SUBSTR(CHAMP2, 1, 4)    CONCAT   '-'   CONCAT
      SUBSTR(CHAMP2, 5, 2)   CONCAT    '-'   CONCAT
      SUBSTR(CHAMP2, 7, 2) IN (Curdate(), OuvrableP(Curdate()))
    et pour t'éviter tes concat et tes substr sur tes champs de 8 car, tu créés une fonction pour ce faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create function QGPL/cdate(w char(8)) returns Date
    language sql                                            
    deterministic                                           
    Disallow Parallel                                       
    no external action                                      
    Returns NULL on NULL Input                              
    Begin                                                   
    Return SUBSTR(w, 1, 4)    CONCAT   '-'   CONCAT         
           SUBSTR(w, 5, 2)    CONCAT    '-'  CONCAT         
           SUBSTR(w, 7, 2);                                 
    End
    Ce qui te donne au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT champ1 FROM monSchema.maTable 
    WHERE cdate(Champ2) 
     IN (Curdate(), OuvrableP(Curdate()))
    CQFD

  10. #10
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par K2R400 Voir le message

    CQFD
    Elémentaire, mon cher K2R400...........

  11. #11
    Membre habitué Avatar de dedalios
    Homme Profil pro
    concepteur d'application
    Inscrit en
    Février 2008
    Messages
    495
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : concepteur d'application
    Secteur : Santé

    Informations forums :
    Inscription : Février 2008
    Messages : 495
    Points : 152
    Points
    152
    Par défaut
    Les jours ouvrés n'est-ce une spécificité de chaque société .Sauf à avoir chaque année une liste exacte de ces dates dans une liste spécifique fichier ou autre il est difficile de les établir par defaut!!!

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 298
    Points : 1 578
    Points
    1 578
    Par défaut
    +1

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par dedalios Voir le message
    Les jours ouvrés n'est-ce une spécificité de chaque société .Sauf à avoir chaque année une liste exacte de ces dates dans une liste spécifique fichier ou autre il est difficile de les établir par defaut!!!
    T'as raison !!! dans l'administration ils ont presque 399 jours fériés chomés par an !

  14. #14
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par K2R400 Voir le message
    T'as raison !!! dans l'administration ils ont presque 399 jours fériés chomés par an !
    Ben heureusement.....comme ça on peut répondre sur les forums...et aider les futurs informaticiens de l'administration.(mheu non je ne suis pas vexé).

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

Discussions similaires

  1. Récupération des données d'un formulaire
    Par placenargac dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/02/2006, 15h10
  2. récupération des données via une liste déroulante
    Par rahan_dave dans le forum Access
    Réponses: 1
    Dernier message: 13/10/2005, 12h27
  3. [HTML][FORMULAIRE] Probleme dans la récupération des données
    Par baddounet dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 15/08/2005, 18h51
  4. Réponses: 2
    Dernier message: 20/02/2004, 08h47
  5. Réponses: 13
    Dernier message: 20/03/2003, 08h11

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