Mémo Dates 

 

Comparatifs des ordres de manipulation de dates

Fonctions liées aux dates

SQL Retourne Exemple SQL RPG Exemple RPG
DATE(x)
X doit être une chaîne au format SQL en cours
une date DATE(
substr(digits(dat8), 7, 2)
 concat '/' concat
substr(digits(dat8), 5, 2)
 concat '/' concat
substr(digits(dat8), 3, 2) )
%DATE(x:*FMT) wdate =%DATE(
datchar:*DMY) ;
DAY(D)
DAYOFMONTH(D)
 la partie jour de D DAY(DATCDE) %SUBDT(d:*D) jj = %SUBDT(
 DATCDE:*D) ;
MONTH(D) la partie mois de D 

MONTH(current date)

%SUBDT(d:*M) mm = %SUBDT(
%date():*M) ;
YEAR(D)  la partie année  de D  YEAR(current date -                    DATCDE) %SUBDT(d:*Y) mm = %SUBDT(
DATCE:*M) ;
DAYOFYEAR(D) le n° de jour dans l'année (julien) DAYOFYEAR(datdep)
DAYOFWEEK(D) le N° de jour dans la semaine
(1 = Dimanche, 2=Lundi, ...)
DAYOFWEEK(ENTRELE)
DAYOFWEEK_ISO(D) retourne le N° de jour dans la semaine
(1 = Lundi)
DAYOFWEEK_ISO(ENTRELE)
DAYNAME(d) retourne le nom du jour de d (Lundi, Mardi, ...)
DAYNAME(datcde)
MONTHNAME(d) * retourne le nom du mois de d (Janvier, Février, ...)
MONTHNAME(datcde)
EXTRACT(day from d) Extrait la partie jour de D (aussi Month et Year)
EXTRACT(MONTH from datcde)
cf %SUBDT( )
DAYS(D) retourne le nbr de jours depuis 0001-01-01 DAYS(datcde)- DAYS(datliv)

jours = %DIFF(
D'0001-01-01 : datcde : *DAYS) ;

QUARTER(D) retourne le n° du trimestre(1-4) QUARTER(DATEFIN)
WEEK(D) retourne le n° de semaine
(Attention le 1er Janvier est semaine 1)
WHERE
WEEK(DATLIV)= WEEK(DATCDE)
WEEK_ISO(D) retourne le n° de semaine
(la semaine 1 est celle qui possède un JEUDI dans l'année.)
WHERE
WEEK_ISO(DATLIV)= 1
CURDATE() retourne la date en cours, comme CURRENT DATE WHERE
DATLIV = CURDATE()-1 DAY
%DATE() if datcde > %date();
CURTIME() retourne l'heure en cours, comme CURRENT TIME   %TIME()
NOW() retourne le timestamp en cours   %TIMESTP()
JULIAN_DAY(d) retourne le nbr de jours qui sépare une date du 1er Janv. 4712 av JC.
JULIAN_DAY(datcde)
ADD_MONTHS(d, nbr) ajoute un nbr de mois à une date ,
si la date est au dernier jour du mois, la date calculée est aussi au dernier jour du mois
ADD_MONTHS('2006-04-30' , 1)
= 2006-05-31
NEXT_DAY(d, 'day' ) retourne le timestamp de la prochaine date ayant le jour demandé
NEXT_DAYS('2006-12-31' , 'DIM') 
= ' 2007-01-07-00.00.00.000000'
Test de la validité d'une zone caractère ou numérique contenant une date. TEST(DE) TEST(DE) datchar;
if %error ;
  .....
endif;

Fonctions liées aux heures

Fonction(x) Retourne  Exemple RPG
TIME(T) une heure TIME(
substr(digits(h6), 1, 2)
 concat ':' concat
substr(digits(h6), 3, 2)
 concat ':' concat
substr(digits(h6), 5, 2) )
%TIME()
HOUR(T)
retourne la partie heure de T HOUR(Pointage) %SUBDT(T:*H)
MINUTE(D) retourne la partie minute de T

 

%SUBDT(T:*Mn)
SECOND(T) Retourne la partie secondes de T   %SUBDT(T:*S)
EXTRACT(hour from t)  la partie heure de T (aussi MINUTE et SECOND)
EXTRACT(SECOND from pointage)

Fonctions liées aux Timestamp

Fonction(x) Retourne  Exemple RPG
TIMESTAMP(T) un timestamp (date - heure - microsecondes) TIMESTAMP('
1999-10-06.15.45.00.000001 ')
%TIMESTP()
TIMESTAMP
(D T)
un timestamp (microsecondes à 0) TIMESTAMP(datcde heure)
TIMESTAMP_ISO(x) 

un timestamp à partier de x
 Si x est une date, l'heure est à 00:00:00
 Si x est une heure, la date est à aujourd'hui.
TIMESTAMP_ISO(heure_pointage)
TIMESTAMPDIFF
(c 'DIFFERENCE')
C indique l'unité de mesure de l'écart que vous souhaitez obtenir
1 = fractions de s. 16 = jours
2 = secondes 32 = semaines
4 = minutes 64 = mois
8 = heures 128 = trimestres
  256 = Année

'DIFFERENCE' est la représentation caractères [ CHAR(22) ]
d'un écart entre deux timestamp.

TIMLESTAMPDIFF(32 ,
CAST(
CURRENT_TIMESTAMP
- CAST(DATLIV AS TIMESTAMP)
AS CHAR(22) )
)

indique l'écart en semaines
entre DATLIV et aujourd'hui
MIDNIGHT_SECONDS retourne le nbr de secondes qui sépare un timestamp de minuit
MIDNIGHT_SECONDS(pointage)


Quelques fonctions utiles EN RPG

 * calcul de la fin de mois
* astuce : pour le 17 Janvier, se positionner au 17 Février et enlever 17 jours

Dfindemois PI          D   
D Datein                      D   CONST

P Findemois       B               EXPORT
D                 PI          D
D Datein                      D   CONST

D Wdate S D

/free
wdate = Datein + %months(1);
wdate = wdate - %days( %subdt(wdate : *DAYS) ); 
return wdate;
/end-free
 * calcul du N° de semaine
* astuce : on part d'un dimanche connu (6 Janvier 80)
* on divise l'écart en jours, le reste EST le N° de jour dans la semaine
* sauf dimanche (= 0) ou on retourne 7.

Djoursemaine PI         1 0   
D Datein                      D   CONST

P joursemaine     B               EXPORT
D                 PI         1 0 
D Datein                      D   CONST

D Wdate S D

/free
nbdejours = %DIFF(wdate : D'1980-01-06' : *DAYS) ;
reste = %REM(nbdejours : 7);
if reste < 1; 
return reste + 7;
else;
return reste;
endif;
/end-free
 dsemaine          PR             2P 0
 d datein        D const

 psemaine     B                   export
 d                 pi             2P 0
 d datein                          D   const
 d                 DS                        
 d janvier4                        D   INZ(D'0001-01-04')         
 d  ANjanvier4                    4  0 OVERLAY(janvier4)          
 d Lundi           S               D                              
  /free                                                            
    // calcul du 4 janvier de l'année traitée                     
    ANjanvier4 = %SUBDT(DateIn : *Y);                             
    // calcul du Lundi précédent le 4 janvier                     
    Lundi = janvier4 - %DAYS(dayofweek(janvier4)-1) ;                                                                                
    // si date recue < au lundi ==> premier lundi,année précédente 
    if DateIn < Lundi;                                            
       ANjanvier4 -= 1;                                           
       Lundi = janvier4 - %DAYS(dayofweek(janvier4)+1);           
    endif;                                                        
    // nombre de semaine entières                                  
   return %DIV( %DIFF(DateIn:Lundi:*DAYS) : 7) +1;                
  /end-free                                                       


Dates ET DSPF

Les mots-clé DATFMT [éventuellement DATSEP] sont admis sur les écrans (depuis la V4R2)


A LA SAISIE :

- les séparateurs ne sont PAS obligatoires !
- les zéros [à gauche] non plus
     pour le 1er Février 2006 on admet avec DATFMT(*DMY) :  01/02/06
                                                010206
                                                10206
                                                1/2/06

-   on admet aussi DATFMT(*JOB) qui affiche (et accepte) une date au
    format du job en cours(*DMY en France), mais transmet TOUJOURS en *ISO
Enfin, un nouveau mot-clé MAPVAL est implémenté afin d'établir des conversions
     entre valeur affichée et valeur transmise au pgm.

     MAPVAL( (valeur-pgm1 valeur-écran1)
             (valeur-pgm2 valeur-écran2) ...)  jusqu'à 100 correspondances

     avec comme valeurs particulières :

          *BLANK on affiche que des blancs           *CUR   valeur en cours (date en cours ou heure en cours)

exemple :        MAPVAL(('01/01/40' *BLANK))

                  si le pgm contient 01/01/40 j'affiche des blancs
             ET   si l'utilisateur entre des blancs j'envoi 01/01/40