IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

escartefigue

[Actualité] DB2 for Z/OS : créer un calendrier

Note : 3 votes pour une moyenne de 4,00.
par , 31/01/2025 à 16h30 (5437 Affichages)
Créer un calendrier par requête est un besoin fréquent et assez simple à mettre en œuvre.

Les fonctions date et chaîne de caractères étant assez différentes d'un dialecte SQL à l'autre en fonction du SGBD-R sous-jacent, voici la variante DB2 for Z/OS, qu'on pourra assez facilement décliner pour tout autre SGBD-R.

Ici, le calendrier contiendra une ligne par date avec :
  • le N° du jour dans la semaine au format ISO (de 1=lundi à 7=dimanche) ;
  • le libellé du jour, ici j'ai préféré ne pas utiliser la fonction DAYNAME, rarement implémentée sur les sites Z/OS ;
  • le quantième ;
  • le numéro de semaine ;
  • la notion de jour ouvrable O/N applicable en France, hors spécificités régionales.


Pour les jours ouvrables, seuls ceux calculables sont affectés par la requête, les jours variables (Pâques, ascension...) seront à corriger manuellement post requête.
Comme il s'agit ici d'un calendrier global, les particularités régionales (Alsace et Moselle, Guadeloupe, Guyane...) ne sont pas prises en compte.
De la même façon, la notion de jour ouvré étant propre à chaque site, elle n'est pas gérée ici : le cas échéant, il faut créer un calendrier par site.

La requête (on adaptera la date de début et le nombre de dates à stocker en fonction du besoin) :

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
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
-- creation d'un calendrier à partir d'une date de début DTDEB                 
-- et pour un nombre de jours paramétré                                        
   with T0(DTDEB) as                                                           
       (select '2025-01-01'                                                    
        from SYSIBM.SYSDUMMY1                                                  
       )                                                                       
-- la fonction DAYNAME est rarement implémentée, d'où T1 "en dur"              
      , T1(T1JNUM, T1JNOM) as                                                  
       (select 1, 'lundi'    from SYSIBM.SYSDUMMY1   union all                 
        select 2, 'mardi'    from SYSIBM.SYSDUMMY1   union all                 
        select 3, 'mercredi' from SYSIBM.SYSDUMMY1   union all                 
        select 4, 'jeudi'    from SYSIBM.SYSDUMMY1   union all                 
        select 5, 'vendredi' from SYSIBM.SYSDUMMY1   union all                 
        select 6, 'samedi'   from SYSIBM.SYSDUMMY1   union all                 
        select 7, 'dimanche' from SYSIBM.SYSDUMMY1                             
       )                                                                       
      , T2(T2DTE, T2JNUM, T2JNOM, T2QQQ, T2SEM, T2OUV, T2SEQ) as               
       (select  cast(DTDEB as date)                                            
             ,  dayofweek_iso(DTDEB)                                           
             ,  T1JNOM                                                         
             ,  days(DTDEB)-days(substr(DTDEB, 01, 05) !! '01-01') + 1         
             ,  week_iso(DTDEB)                                                
             ,  case when dayofweek_iso(DTDEB)  = 7       then 0               
                     when substr(DTDEB, 06, 05) = '01-01' then 0               
                     when substr(DTDEB, 06, 05) = '05-01' then 0               
                     when substr(DTDEB, 06, 05) = '05-08' then 0               
                     when substr(DTDEB, 06, 05) = '07-14' then 0               
                     when substr(DTDEB, 06, 05) = '08-15' then 0               
                     when substr(DTDEB, 06, 05) = '11-01' then 0               
                     when substr(DTDEB, 06, 05) = '11-11' then 0               
                     when substr(DTDEB, 06, 05) = '12-25' then 0               
                     else 1                                                    
                end                                                            
             ,  cast(1 as smallint)                                            
        from T0                                                                
        inner join T1                                                          
           on T1JNUM=DAYOFWEEK_ISO(DTDEB)                                      
        union all                                                              
        select  T2DTE + 1 days                                                 
             ,  DAYOFWEEK_ISO(T2DTE + 1 days)                                  
             ,  T1JNOM                                                         
             ,  days(T2DTE + 1 days)                                           
                - days(substr(char(T2DTE), 01, 05) !! '01-01') + 1             
             ,  week_iso(T2DTE + 1 days)                                       
             ,  case when dayofweek_iso(T2DTE + 1 days)  = 7  then 0           
                     when substr(char(T2DTE+1 days), 06, 05) ='01-01'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='05-01'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='05-08'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='07-14'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='08-15'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='11-01'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='11-11'          
                     then 0                                                    
                     when substr(char(T2DTE+1 days), 06, 05) ='12-25'          
                     then 0                                                    
                     else 1                                                    
                end                                                            
             ,  T2SEQ + 1                                                      
        from T2                                                                
        inner join T1                                                          
           on T1JNUM=DAYOFWEEK_ISO(T2DTE + 1 days)                             
        where   T2SEQ < 366                                                    
       )                                                                       
   select T2DTE, T2JNUM, T2JNOM, T2QQQ, T2SEM, T2OUV                           
   from T2                                                                     
   order by T2DTE                                                              
   ;

Résultat (extrait) :

Nom : Sans titre.png
Affichages : 327
Taille : 41,6 Ko

Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Viadeo Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Twitter Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Google Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Facebook Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Digg Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Delicious Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog MySpace Envoyer le billet « DB2 for Z/OS : créer un calendrier » dans le blog Yahoo

Commentaires