Skapa ett datumintervall från ett enskilt datum

Ibland lagras inte tidsintervallen med en explicit början och ett explicit slut. Istället impliceras de av endast ett fält, ändringstidsmarkören.

Det kan till exempel se ut som i tabellen nedan där du har valutakurser för flera olika valutor. Varje valutakursändring står på en egen rad, var och en med en ny omräkningskurs. Tabellen har även rader med tomma datum som motsvarar den ursprungliga valutakursen, innan den första ändringen skedde.

Valutakurser
Valuta Ändra datum Kurs
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

Tabellen ovan definierar en uppsättning icke-överlappande intervall, där startdatumet kallas Change Date och slutdatumet definieras av början på det efterföljande intervallet. Eftersom slutdatumet inte finns explicit lagrat i en egen kolumn måste vi skapa en sådan kolumn, så att den nya tabellen blir en lista över intervaller.

Gör följande:

  1. Skapa en ny app och ge den ett namn.
  2. Lägg till ett nytt skriptavsnitt i Skriptredigeraren.
  3. Lägg till följande inline-tabell. Se till att datumen i Change Date-kolumnen har samma format som det lokala datumformatet.
  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. Bestäm vilket tidsintervall du vill arbeta med. Början på intervallet måste infalla före det första datumet i dina data och intervallets slut måste infalla efter det sista.

    Lägg till följande längst upp i skriptet:

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

  6. Läs in källdata, men ändra de tomma datumen till början på intervallet som definieras i föregående punkt. Ändringsdatumet ska läsas in som "From Date".

    Sortera tabellen, först efter Currency och sedan efter "From Date" i fallande ordning, så att du får de senaste datumen högst upp.

    Lägg till följande efter In_Rates-tabellen.

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

  7. Kör ett andra pass på dina data där du beräknar "To Date". Om den aktuella posten har en annan valuta än den förra posten innebär det att det är den första posten med en ny valuta (men dess sista intervall), så du ska använda slutet på intervallet som definieras i steg 1. Om det är samma valuta ska du ta "From Date" från den föregående posten, subtrahera en liten tidsmängd och använda detta värde som "To Date" i den aktuella posten.

    Lägg till följande efter Tmp_Rates-tabellen.

    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. Ditt skript bör se ut så här:

    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;

Skriptet uppdaterar källtabellen på följande sätt:

Uppdaterad källtabell
Valuta Kurs FromDate ToDate
EUR 8.45 15/02/2013 vEndTime
EUR 8.69 28/01/2013 14/02/2013 23:59:59
EUR 8.59 vBeginTime 28/01/2013 23:59:99
USD 6.30 03/02/2013 vEndTime
USD 6.56 10/01/2013 2/02/2013 23:59:59
USD 6.50 vBeginTime 9/01/2013 23:59:59

I din app visas tabellen så här:

Dataförhandsgranskning
Valuta Kurs FromDate ToDate
EUR 8.45 15/02/2013 01/03/2013
EUR 8.69 28/01/2013 14/02/2013
EUR 8.59 01/01/2013 28/01/2013
USD 6.30 03/02/2013 01/03/2013
USD 6.56 10/01/2013 2/02/2013
USD 6.50 01/01/2013 9/01/2013

Tabellen kan sedan användas för att jämföra med ett befintligt datum med hjälp av Intervalmatch-metoden.

Hjälpte den här informationen?

Tack för att du berättar det här. Är det något du vill säga om det här avsnittet?

Varför var informationen inte till hjälp och hur kan vi förbättra den?