MANIPULATIONS DES DATES (SIMPLYDAT)
|
Un des gros problèmes sur les bases de
données existantes sur system i est
que les dates ne sont pas dans des formats de type date. Ce qui vous interdit toutes les
manipulations courantes en SQL |
Comme
par exemple :
Comparaison d'une date avec la date du jour pour
calculer un âge
Ajouter de 3 mois à une date pour calculer une
échéance
etc ...
Voici
plusieurs exemples possibles avec des variables de type date :
1)
Dans
une table commande qui contient une date de livraison et une date de commande
Création
de l'enregistrement date de commande = date en cours et date de livraison =
'01/01/01' (valeur arbitraire)
INSERT INTO COMMANDE (date_liv,
date_cde)
VALUES
('01/01/01', curdate())
Mise à
jour de l'enregistrement de la date de livraison = date de commande + 7 jours
UPDATE
COMMANDE
SET
DATE_LIV = DATE_CDE + 7 days
WHERE
DATE_LIV = '01/01/01'
utilisation
de (days, month, years )
pour ajouter des durées
Sélection des enregistrements ou la date de livraison
est supérieure à la date du jour
SELECT * FROM COMMANDE
WHERE DATE_LIV > curdate() - 3
days
Calculer
le nombre de jours entre 2 dates
SELECT DAYOFYEAR(curdate()) as num_jour
FROM
COMMANDE
2)
Dans
une table employé qui contient une date de naissance
Connaitre
le jour de naissance d'un employé
SELECT dayname(date_nai) jour_de_nais
FROM EMPLOYE
Sélectionner
les employés qui ont plus de 50 ans
SELECT DATE_LIV
FROM COMMANDE
WHERE (curdate() - DATE_LIV >
500000)
La durée
est exprimée en aaaammjj
3)
Divers
Connaitre
le numéro du jour dans l'année
SELECT DAYOFYEAR(curdate()) as num_jour
FROM xxx
Pour
pouvoir quand même utiliser les formats de date sans utiliser des syntaxes
imbuvables
Exemple :
DATE(substr(digits(datliv),
7, 2) concat '/' concat substr(digits(datliv), 5, 2) concat '/' concat substr(digits(datliv), 3, 2) )
SimplyDat est un ensemble de fonctions à choisir selon les
formats des dates de vos bases de
données qui va vous permettre de vous concentrer sur votre métier et non sur
les calculs liés aux dates.
L’utilisation
d’une fonction est ultrasimple :
function(votre zone date)
Ce qui
vous donnera par exemple une syntaxe function(dat_liv) - function(dat_cde) pour comparer
2 dates
Règles
utilisées :
Une
fonction admet aussi bien des paramètres numériques que des paramètres
alphanumériques
Mais
contrôle la longueur passée et renvoi une erreur en cas de non-conformité
Toutes
les fonctions sont déclinées en 2 versions
Une
version qui reverra 01/01/01 en cas de date invalide et une suivie d’un N qui
renverra la valeur NULL
La version 1.1 Inclus les formats suivants :
CYMDToDate( siecle,
date ) et CYMDToDateN( siecle,
date )
YYMDToDate( date ) et YYMDToDateN( date )
YMDToDate( date ) et YMDToDateN( date )
Installation
:
Récupération du script en cliquant
ici
Il vous suffit de rejouer ce script
Par exemple RUNSQLSTM du script récupéré SimplyDat
La bibliothèque
par défaut est QGPL mais il est conseillé d'en mettre une autre (qui devra être
présente dans la liste des bibliothèques au moment de l'exécution)
Pour cela
avant le lancer votre RUNSQLSTM faites un CHGCURLIB VOTREBIB
Pré-requis
:
Niveau de version V5R3 minimum
Exemples :
SELECT yymdtodate( CHAR8SAMJ ) as datedebut,
CHAR8SAMJ
FROM EMPLOYE
WHERE yymdtodate( CHAR8SAMJ ) <= curdate()
Donne :
DATEDEBUT CHAR8SAMJ
2010-05-24 20100524
0001-01-01 20103131
SELECT case when yymdtodaten( CHAR8SAMJ ) is null then curdate()
else yymdtodaten(
CHAR8SAMJ ) end datedebut, CHAR8SAMJ
FROM EMPLOYE
Donne :
DATEDEBUT CHAR8SAMJ
2010-05-24 20100524
2010-05-25 20103131