Accéder au contenu principal Passer au contenu complémentaire

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.

Currency rates
CurrencyChange DateRate
EUR-8.59
EUR28/01/20138.69
EUR15/02/20138.45
USD-6.50
USD10/01/20136.56
USD03/02/20136.30

Le tableau ci-dessus 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.

  1. Créez une application et nommez-la.
  2. Ajoutez une nouvelle section de script dans l'éditeur de chargement de données.
  3. Ajoutez la table inline suivante. Assurez-vous que les dates figurant dans la colonne Change Date respectent le format de date local.
  4. In_Rates:
    LOAD * Inline [
    Currency,Change Date,Rate
    EUR,,8.59
    EUR,28/01/2013,8.69
    EUR,15/02/2013,8.45
    USD,,6.50
    USD,10/01/2013,6.56
    USD,03/02/2013,6.30
    ];
    

  5. 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.

    Ajoutez les éléments suivants au début de votre script :

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);

  6. 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".

    Triez une première fois la table d'après la devise Currency, puis d'après la date de début "From Date" dans l'ordre décroissant, de manière à placer les dates les plus récentes en haut de la liste.

    Ajoutez les éléments suivants à la table In_Rates :

    Tmp_Rates:
    LOAD Currency, Rate,
        Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates;

  7. Exécutez un deuxième passage sur les données afin de calculer la date de fin "To Date". Si l'enregistrement actif comporte une devise différente de celle de l'enregistrement précédent, 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 un petit intervalle de temps, puis utiliser cette valeur comme date de fin "To Date" dans l'enregistrement actif.

    Ajoutez les éléments suivants à la table Tmp_Rates :

    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;
    

  8. Le script devrait avoir l'aspect suivant :

    Let vBeginTime = Num('1/1/2013');
    Let vEndTime = Num('1/3/2013');
    Let vEpsilon = Pow(2,-27);
    
    In_Rates:
    LOAD * Inline [
    Currency,Change Date,Rate
    EUR,,8.59
    EUR,28/01/2013,8.69
    EUR,15/02/2013,8.45
    USD,,6.50
    USD,10/01/2013,6.56
    USD,03/02/2013,6.30
    ];  
    
    Tmp_Rates:
    LOAD Currency, Rate,	
        Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
    Resident In_Rates; 
    
    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;

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

Table source mise à jour
CurrencyRateFromDateToDate
EUR8.4515/02/2013vEndTime
EUR8.6928/01/201314/02/2013 23:59:59
EUR8.59vBeginTime28/01/2013 23:59:99
USD6.3003/02/2013vEndTime
USD6.5610/01/20132/02/2013 23:59:59
USD6.50vBeginTime9/01/2013 23:59:59

Dans votre application, la table apparaît comme suit :

Aperçu des données
CurrencyRateFromDateToDate
EUR8.4515/02/201301/03/2013
EUR8.6928/01/201314/02/2013
EUR8.5901/01/201328/01/2013
USD6.3003/02/201301/03/2013
USD6.5610/01/20132/02/2013
USD6.5001/01/20139/01/2013

Cette table peut ensuite servir dans un comparatif à une date existante à l'aide de la méthode Intervalmatch.

Cette page vous a-t-elle aidé ?

Si vous rencontrez des problèmes sur cette page ou dans son contenu – une faute de frappe, une étape manquante ou une erreur technique – faites-le-nous savoir.