Gå till huvudinnehåll Gå till ytterligare innehåll

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 datumKurs
EUR-8.59
EUR28/01/20138.69
EUR15/02/20138.45
USD-6.50
USD10/01/20136.56
USD03/02/20136.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.

  1. Skapa en ny applikation och ge den ett namn.
  2. Lägg till ett nytt skriptavsnitt i Skriptredigeraren.
  3. Lägg till den följande inline-tabellen. Se till att datumen i kolumnen Change Date 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 överst 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, sedan efter "From Date" i fallande ordning så att du får de senaste datumen överst.

    Lägg till följande efter tabellen In_Rates:

    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öregående 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, dra av en liten mängd tid 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 kommer att uppdatera källtabellen på följande sätt:

Uppdaterad källtabell
ValutaKursFrån datumTill datum
EUR8,452013-02-15vEndTime
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

I din applikation visas tabellen på följande sätt:

Dataförhandsgranskning
ValutaKursFromDateTill datum
EUR8,4515/02/201301/03/2013
EUR8,692013-01-2814/02/2013
EUR8,5901/01/20132013-01-28
USD6,302013-03-022013-01-03
USD6,562013-10-012/02/2013
USD6,502013-01-019/01/2013

Tabellen kan sedan användas i en jämförelse med ett befintligt datum med hjälp av Intervalmatch metoden.

Var den här sidan till hjälp för dig?

Om du stöter på några problem med den här sidan eller innehållet på den, t.ex. ett stavfel, ett saknat steg eller ett tekniskt fel – meddela oss!