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

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

DB2 for Z/OS : apprendre comment créer un calendrier par requête sql
Un billet blog de Escartefigue

Le , par escartefigue

0PARTAGES

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):

-- 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) :

664062

Vous avez lu gratuitement 5 312 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !