Recherche sur le blog

mercredi 30 avril 2014

[SQL] Mémo – Dates dans DB2 UDB for iSeries

Sur l’AS/400, lorsqu’on utilise des champs de type date, il faut parfois utiliser certaines fonctions de conversion ou du moins utiliser une chaine de caractères d’un format spécifique. Il existe aussi un tas de fonctions qui permettent par exemple de récupérer le jour de la semaine, le libellé du mois, ou bien une représentation sous forme d’entier. 

Fonction “Date”

Il est possible de passer une chaine de caractères à la fonction “Date” pour retourner une variable du bon type. Dans l’exemple qui suit, on utilise la table système pour obtenir une seule ligne de résultat. La chaine de caractère passée en paramètre est au format “MM/DD/YYYY”.
SELECT DATE('04/10/2014') FROM sysibm/sysdummy1;
Ce qui permet d’obtenir à l’écran “10/04/2014”. On peut également convertir ce résultat au format “YYYY-MM-DD” grâce à la fonction CHAR. Celle-ci prend en paramètre une variable ou un champ de type date ainsi qu’un paramètre facultatif supplémentaire étant le type (ex : ISO, USA). 
SELECT CHAR(DATE('04/10/2014'),iso) FROM sysibm/sysdummy1;
Cette requête nous retourne alors la date “2014-04-10”, soit le 10 avril : c’est ce que nous cherchions effectivement à faire. En utilisant le format “usa” au lieu d’”iso”, nous aurions obtenu exactement le même résultat que la chaine passée en paramètre de la fonction “DATE”. 

Une chaine de caractères directement dans la condition
  
Il est également possible de récupérer des résultats d’une table en comparant la date à une chaine de caractères, pour autant qu’elle soit au bon format. En pratique, on pourrait directement utiliser les fonctions CHAR et DATE, mais il est également possible de réaliser ceci :
SELECT * FROM MA_TABLE WHERE CH_DAT = '2014-04-10';
Dans l’exemple ci-dessus, nous possédons une table nommée “MA_TABLE” contenant plusieurs champs dont un de type date, “CH_DAT”. Ce champ n’est donc pas un numérique, qui est pourtant couramment utilisé pour stocker les dates au format YYYYMMDD. 

Récupérer le jour, le mois, l’année… 

Comme on le sait, les champs de type date imposent d’effectuer des conversions, mais permettent tout de même de récupérer des données aisément sans avoir à découper une quelconque chaine de caractères. Inutile de se battre avec la fonction SUBSTRING pour récupérer le jour ou le mois.
SELECT DAY(CH_DAT) FROM MA_TABLE;
SELECT MONTH(CH_DAT) FROM MA_TABLE;
SELECT YEAR(CH_DAT) FROM MA_TABLE;
En supposant que le champ “CH_DAT” soit bien de type date, nous récupérons alors les jours, les mois ou les années pour chaque ligne de la table. Depuis la V5R3, il est également possible de récupérer le libellé du mois (ex : Janvier, Février, etc), avec la fonction MONTHNAME.
SELECT MONTHNAME(CURRENT DATE) FROM SYSIBM/SYSDUMMY1;
Dans l’exemple ci-dessus, nous utilisons “CURRENT DATE” qui renvoie la date système. Du coup, avec la requête ci-dessus, nous récupérons la valeur “Avril”, ce qui est bien correct puisque nous sommes bien le 30 du mois lors de l’exécution de la requête. 

D’autres fonctions utiles… 

Il existe bien entendu des fonctions qui permettent notamment de renvoyer le jour de la semaine avec DAYOFWEEK, qui considère que le dimanche est le premier jour de la semaine, et DAYOFWEEK_ISO, qui considère que c’est le lundi le 1er. La fonction DAYS renvoie une interprétation de la date en entier, ce qui permet également de calculer le nombre de jours qui se sont écoulés entre deux dates. La fonction JULIAN_DAY permet de renvoyer le nombre de jours entre le 1er janvier 4712 avant J.C. jusqu’à la date renseignée en paramètre. Enfin on peut aussi utiliser WEEK ou WEEK_ISO pour obtenir le numéro de la semaine, sans avoir à effectuer de calcul particulier…

Aucun commentaire: