%TIMESTAMP
Créer un horodatage
Fabrique un horodatage (date, heure et microsecondes) à partir d'un texte, d'une date ou d'un autre horodatage, ou lit l'horloge quand on ne donne rien.
Syntaxe
%TIMESTAMP()
%TIMESTAMP(expression)
%TIMESTAMP(expression : *ISO)
expression- Un texte de 26 caractères
AAAA-MM-JJ-HH.MM.SS.MMMMMM, ou une date (on obtient minuit). Sans expression, on obtient l'instant présent. *ISO- Précise que le texte est au format ISO. C'est le format attendu par défaut, il est donc facultatif.
- Résultat
- Une valeur de type horodatage. Le texte doit comporter les six chiffres de microsecondes ; sinon l'erreur RNQ0112 est signalée (statut 112 dans
monitor).
À quoi ça sert
L'horodatage est le seul type qui garde la date et l'heure ensemble. C'est lui qu'il faut pour mesurer un délai qui traverse minuit, dater un enregistrement ou calculer une échéance en heures. %TIMESTAMP() donne aussi le moment exact d'un événement à consigner dans un journal.
Exemple 1 : Texte, date et assemblage
**free
// %TIMESTAMP : creer un horodatage a partir d'un texte, d'une date ou de deux morceaux.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s ouverture timestamp;
dcl-s minuit timestamp;
dcl-s assemble timestamp;
dcl-s texte varchar(26);
dcl-s jour date inz(d'2026-09-30');
dcl-s heure time inz(t'14.05.30');
// Le texte doit avoir la forme AAAA-MM-JJ-HH.MM.SS.MMMMMM (26 caracteres).
texte = '2026-09-30-08.15.00.250000';
ouverture = %timestamp(texte);
snd-msg 'Depuis un texte : [' + %char(ouverture) + ']';
// Une date devient l'horodatage de minuit.
minuit = %timestamp(jour);
snd-msg 'Depuis une date : [' + %char(minuit) + ']';
// Date et heure separees : on assemble le texte, puis on convertit.
texte = %char(jour : *iso) + '-' + %char(heure : *iso) + '.000000';
assemble = %timestamp(texte);
snd-msg 'Date + heure : [' + %char(assemble) + ']';
// Retour vers une date ou une heure.
snd-msg 'Sa date : [' + %char(%date(assemble)) + ']';
snd-msg 'Son heure : [' + %char(%time(assemble)) + ']';
// Sans blancs ni tirets, pratique pour un nom de fichier.
snd-msg 'Format *ISO0 : [' + %char(assemble : *iso0) + ']';
// Sans parametre, %TIMESTAMP() lit l'horloge (ici, on n'affiche que sa longueur).
snd-msg 'Horloge, longueur : ' + %char(%len(%char(%timestamp())));
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Depuis un texte : [2026-09-30-08.15.00.250000]
Depuis une date : [2026-09-30-00.00.00.000000]
Date + heure : [2026-09-30-14.05.30.000000]
Sa date : [2026-09-30]
Son heure : [14.05.30]
Format *ISO0 : [20260930140530000000]
Horloge, longueur : 26
Un texte de 26 caractères est converti tel quel. Une date devient l'horodatage de minuit. Pour combiner une date et une heure séparées, on assemble le texte avec %CHAR, puis on convertit. %DATE et %TIME font le chemin inverse. Le format *ISO0 de %CHAR supprime les séparateurs, pratique pour un nom de fichier. %TIMESTAMP() lit l'horloge (on n'affiche que la longueur du texte pour garder une sortie stable).
Exemple 2 : Texte court et fractions perdues
**free
// %TIMESTAMP : texte trop court, fractions de seconde perdues.
ctl-opt dftactgrp(*no) actgrp(*new);
dcl-s complet timestamp;
dcl-s seconde timestamp(0);
dcl-s milli timestamp(3);
dcl-s texte varchar(26);
// Sans les 6 chiffres de fractions, le texte est refuse.
texte = '2026-09-30-14.05.30';
monitor;
complet = %timestamp(texte);
snd-msg 'Texte court : accepte';
on-error;
snd-msg 'Texte court : refuse, statut ' + %char(%status);
endmon;
texte = '2026-09-30-14.05.30.000000';
complet = %timestamp(texte);
snd-msg 'Texte complet : [' + %char(complet) + ']';
// Une zone timestamp(0) ou timestamp(3) tronque sans erreur.
complet = %timestamp('2026-09-30-14.05.30.987654');
seconde = complet;
milli = complet;
snd-msg 'timestamp(6) : [' + %char(complet) + ']';
snd-msg 'timestamp(3) : [' + %char(milli) + ']';
snd-msg 'timestamp(0) : [' + %char(seconde) + ']';
*inlr = *on;
Résultat réel, compilé et exécuté sur IBM i 7.5 :
Texte court : refuse, statut 112
Texte complet : [2026-09-30-14.05.30.000000]
timestamp(6) : [2026-09-30-14.05.30.987654]
timestamp(3) : [2026-09-30-14.05.30.987]
timestamp(0) : [2026-09-30-14.05.30]
Un texte sans les six chiffres de microsecondes est refusé (statut 112). Affecter un horodatage à une zone timestamp(3) ou timestamp(0) tronque les fractions, sans arrondi et sans erreur.
Le piège
Le texte doit faire exactement 26 caractères. '2026-09-30-14.05.30' (sans microsecondes) est refusé avec RNQ0112 : il faut écrire '2026-09-30-14.05.30.000000'. Un format « SQL » avec espace et deux-points (2026-09-30 14:05:30.123456) est refusé lui aussi.
Second piège, silencieux : copier un horodatage dans une zone timestamp(0) ou timestamp(3) coupe les décimales sans prévenir (987654 devient 987, ou rien du tout).