%DAYS
Durée en jours
Représente un nombre de jours, à ajouter à une date ou à un horodatage, ou à en retrancher.
Syntaxe
date + %DAYS(nombre)
date - %DAYS(nombre)
nombre- Le nombre de jours : une constante, une zone numérique ou une expression. Un nombre négatif fait reculer.
- Résultat
- Une durée, qui n'a de sens que dans une addition ou une soustraction avec une date ou un horodatage. Le résultat est du même type que la valeur de départ ; sur un horodatage, l'heure est conservée.
À quoi ça sert
Calculer une échéance à 30 ou 45 jours, une date de relance ou un délai de livraison est le cas d'usage le plus courant des dates. Écrire facture + %DAYS(45) évite tout calcul de calendrier : les longueurs de mois et les années bissextiles sont gérées par le langage.
Exemple 1 : Échéances et relances
**free
// %DAYS : ajouter ou retirer un nombre de jours a une date ou a un horodatage.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s facture date inz(d'2026-09-30');
dcl-s echeance date;
dcl-s relance date;
dcl-s delai int(10) inz(45);
dcl-s stamp timestamp inz(z'2026-09-30-16.30.00.000000');
// Echeance a 45 jours : le nombre peut venir d'une zone.
echeance = facture + %days(delai);
snd-msg 'Echeance 45 j : [' + %char(echeance : *eur) + ']';
// Relance 10 jours avant l'echeance.
relance = echeance - %days(10);
snd-msg 'Relance J-10 : [' + %char(relance : *eur) + ']';
// Un nombre negatif recule.
snd-msg 'Facture + (-1) j : [' + %char(facture + %days(-1) : *eur) + ']';
// Sur un horodatage, l'heure est conservee.
snd-msg 'Horodatage + 2 j : [' + %char(stamp + %days(2)) + ']';
// Passage de fin d'annee et annee bissextile (2028 a un 29 fevrier).
snd-msg '31/12/2027 + 60 j : [' + %char(d'2027-12-31' + %days(60) : *eur) + ']';
snd-msg '28/02/2028 + 1 j : [' + %char(d'2028-02-28' + %days(1) : *eur) + ']';
snd-msg '28/02/2026 + 1 j : [' + %char(d'2026-02-28' + %days(1) : *eur) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Echeance 45 j : [14.11.2026]
Relance J-10 : [04.11.2026]
Facture + (-1) j : [29.09.2026]
Horodatage + 2 j : [2026-10-02-16.30.00.000000]
31/12/2027 + 60 j : [29.02.2028]
28/02/2028 + 1 j : [29.02.2028]
28/02/2026 + 1 j : [01.03.2026]
45 jours après le 30 septembre : le 14 novembre. Le nombre de jours peut venir d'une zone. Le 31 décembre 2027 plus 60 jours donne le 29 février 2028 (année bissextile), alors que le 28 février 2026 plus un jour donne le 1er mars. Sur l'horodatage, l'heure 16:30 est conservée.
Exemple 2 : Jour de la semaine et limite du calendrier
**free
// %DAYS : jour de la semaine par calcul, et limites du calendrier.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s jour date inz(d'2026-09-30');
dcl-s butoir date;
dcl-s rang int(10);
dcl-s noms char(8) dim(7) ctdata perrcd(7);
// Le 01/01/0001 etait un lundi : le reste de la division par 7 donne le rang.
rang = %rem(%diff(jour : d'0001-01-01' : *days) : 7);
snd-msg '30/09/2026 : ' + %trim(noms(rang + 1));
// Dernier jour du calendrier : ajouter 1 jour est une erreur, pas un bouclage.
butoir = d'9999-12-31';
monitor;
butoir = butoir + %days(1);
snd-msg 'Apres 9999-12-31 : ' + %char(butoir);
on-error;
snd-msg 'Apres 9999-12-31 : erreur, statut ' + %char(%status);
endmon;
*inlr = *on;
**ctdata noms
Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
Résultat réel, compilé et exécuté sur IBM i 7.5 :
30/09/2026 : Mercredi
Apres 9999-12-31 : erreur, statut 113
Le 1er janvier de l'an 1 était un lundi : le reste de la division par 7 de l'écart en jours donne le rang du jour (0 pour lundi). Le 30 septembre 2026 est un mercredi. Ajouter un jour au 31 décembre 9999 déclenche une erreur (statut 113), il n'y a pas de bouclage.
Le piège
Sur une date, seuls les jours, les mois et les années sont permis. date + %HOURS(24), %MINUTES, %SECONDS ou %MSECONDS ne compilent pas (RNF7584) : pour compter en heures, il faut un horodatage. Symétriquement, heure + %DAYS(1) est refusé (RNF7585).
À l'exécution, le seul danger est la limite du calendrier : au-delà du 31 décembre 9999 (ou avant l'an 1), le programme s'arrête avec le statut 113, à intercepter par monitor si la date vient de l'extérieur.