Création d'un intervalle de dates à partir d'une seule date

Il arrive que les intervalles de temps ne soient pas stockés de manière explicite avec un début et une fin. Au lieu de cela, ils sont définis de manière implicite par un seul champ, l'horodatage de modification.

La table ci-dessous illustre une situation de ce genre, avec les taux de change définis pour plusieurs devises. Chaque modification du taux de change se trouve sur une ligne distincte, chacune avec un nouveau taux de conversion. La table contient par ailleurs des lignes aux dates vides qui correspondent au taux de conversion initial, avant la survenue de la première modification.

Cette table spécifie un ensemble d'intervalles qui ne se chevauchent pas, où la date de début est appelée Change Date et la date de fin est définie par le début de l'intervalle suivant. Cependant, comme la date de fin n'est pas stockée de manière explicite dans une colonne distincte, il est nécessaire de créer une colonne de ce type, afin que la nouvelle table devienne une liste d'intervalles.

Procédez de la façon suivante :

  1. Créez un fichier intitulé Rates.xlsx contenant la table illustrée ci-dessus. Enregistrez-le pour qu'il soit prêt à être chargé.
  2. Assurez-vous que les dates figurant dans la colonne Change Date respectent le format de date local.

  3. Décidez de la plage de temps que vous souhaitez utiliser. Le début de la plage doit être antérieur à la première date dans les données et la fin de la plage doit être postérieure à la dernière date.
  4. Chargez les données source en remplaçant les dates vides par le début de la plage définie au point précédent. La date de modification doit être chargée sous From Date.
  5. Triez une première fois la table d'après la devise Currency, puis d'après la date de début From Date en ordre décroissant, de manière à placer les dates les plus récentes en haut de la liste.
  6. Exécutez un deuxième passage sur les données afin de calculer la date de fin To Date. Si l'enregistrement actif dispose d'une devise différente de celle de l'enregistrement précédent, alors il s'agit du premier enregistrement d'une nouvelle devise (mais son dernier intervalle). Vous devez donc utiliser la fin de la plage définie à l'étape 1. S'il s'agit de la même devise, vous devez prendre la date de début From Date de l'enregistrement précédent, soustraire une petite fraction de temps et utiliser cette valeur comme date de fin To Date dans l'enregistrement actif.

Le script ci-dessous mettra à jour la table source de la manière suivante :

Le script de QlikView ressemble à ceci :

Let vBeginTime = Num('1/1/2013');
Let vEndTime = Num('1/3/2013');
Let vEpsilon = Pow(2,-27);
Tmp_Rates:
LOAD Currency, Rate,
Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
From 'C:\MyFiles\Rates.xlsx'
(ooxml, embedded labels, table is Sheet1);
 
Rates:
LOAD Currency, Rate, FromDate,
Date(If( Currency=Peek(Currency),
Peek(FromDate) - $(#vEpsilon),
$(#vEndTime)
)) as ToDate
Resident Tmp_Rates
Order By Currency, FromDate Desc;
 
Drop Table Tmp_Rates;

 

Une fois le script exécuté, vous disposerez d'une table qui répertoriera correctement les intervalles.

Cette table peut ensuite servir dans un comparatif à une date existante à l'aide des méthodes Intervalmatch.