Vai al contenuto principale Passa a contenuto complementare

Creazione di un intervallo di date da una data singola

Talvolta gli intervalli di tempo non vengono memorizzati in modo esplicito con un inizio e una fine. Vengono invece dedotti da un unico campo, l'indicatore temporale della modifica.

Come, ad esempio, nella tabella seguente che contiene tassi relativi a più valute. Ogni modifica del tasso di valuta si trova su una riga specifica, ognuna con un nuovo tasso di conversione. La tabella contiene inoltre righe con date vuote che corrispondono al tasso di conversione iniziale, prima che venga apportata la prima modifica.

Tassi di cambio
ValutaData modificaValutazione
EUR-8.59
EUR28/01/20138.69
EUR15/02/20138.45
USD-6.50
USD10/01/20136.56
USD03/02/20136.30

La tabella precedente definisce una serie di intervalli non sovrapposti, in cui la data di inizio è denominata Change Date e la data di fine è definita dall'inizio dell'intervallo seguente. Tuttavia, dato che la data di fine non è stata memorizzata esplicitamente in una colonna separata, occorre creare tale colonna in modo che la nuova tabella diventi un elenco di intervalli.

  1. Creare una nuova applicazione e assegnarle un nome.
  2. Aggiungere una nuova sezione dello script nell'editor caricamento dati.
  3. Aggiungere la seguente tabella inline. Assicurarsi che il formato delle date nella colonna Change Date sia identico a quello del formato della data locale.
  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. Stabilire l'intervallo temporale con cui si desidera lavorare. L'inizio dell'intervallo deve essere impostato prima della prima data nei dati, mentre la fine dell'intervallo deve essere impostata dopo l'ultima data.

    Aggiungere quanto segue all'inizio dello script:

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

  6. Caricare i dati sorgente, ma modificare le date vuote all'inizio dell'intervallo definite nel punto precedente. La data di modifica deve essere caricata come "From Date".

    Ordinare la tabella prima in base a Currency, quindi in base a "From Date" in ordine decrescente in modo da avere le date più recenti in alto.

    Aggiungere quanto segue dopo la tabella In_Rates:

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

  7. Eseguire un secondo passaggio sui dati in cui si calcola "To Date". Se il record attuale presenta una valuta diversa rispetto al record precedente, si tratta del primo record di una nuova valuta (ma del suo ultimo intervallo), quindi occorre utilizzare la fine dell'intervallo definito durante il passaggio 1. Se la valuta è la stessa, occorre prendere "From Date" dal record precedente, sottrarre una piccola quantità di tempo e utilizzare questo valore come "To Date" nel record attuale.

    Aggiungere quanto segue dopo la tabella 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. Lo script avrà questo aspetto:

    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;

Lo script aggiornerà la tabella sorgente nel modo seguente:

Tabella sorgente aggiornata
ValutaValutazioneFromDateToDate
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

Nella tua applicazione, la tabella appare come segue:

Anteprima dei dati
ValutaValutazioneFromDateToDate
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

Successivamente, questa tabella potrà essere utilizzata per confrontare una data esistente utilizzando il metodo Intervalmatch.

Hai trovato utile questa pagina?

Se riscontri problemi con questa pagina o con il suo contenuto – un errore di battitura, un passaggio mancante o un errore tecnico – ti pregiamo di farcelo sapere!