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

   ```
   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
   ];
   ```

4. 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);
   ```

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

6. 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;
   ```

   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

| Valuta | Kurs | Från datum | Till datum |
| --- | --- | --- | --- |
| EUR | 8,45 | 2013-02-15 | 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 applikation visas tabellen på följande sätt:

Dataförhandsgranskning

| Valuta | Kurs | FromDate | Till datum |
| --- | --- | --- | --- |
| EUR | 8,45 | 15/02/2013 | 01/03/2013 |
| EUR | 8,69 | 2013-01-28 | 14/02/2013 |
| EUR | 8,59 | 01/01/2013 | 2013-01-28 |
| USD | 6,30 | 2013-03-02 | 2013-01-03 |
| USD | 6,56 | 2013-10-01 | 2/02/2013 |
| USD | 6,50 | 2013-01-01 | 9/01/2013 |

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

## Mer information

* [Länka diskreta data till intervall](https://help.qlik.com/sv-SE/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)