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