# Erstellen eines Datumsintervalls aus einem einzigen Datum

Manchmal werden Zeitintervalle nicht explizit mit einem Start- und Endwert gespeichert. Stattdessen werden sie nur durch ein Feld impliziert – den Zeitstempel der letzten Änderung.

Ein Beispiel hierfür wäre die untere Tabelle, in der Währungskurse für mehrere Währungen angegeben werden. Jede Währungskursänderung befindet sich in einer eigenen Zeile; in jeder Zeile ist ein neuer Umrechnungskurs angegeben. Außerdem enthält die Tabelle Zeilen mit leerem Datum, die dem ursprünglichen Umrechnungskurs entsprechen, bevor die erste Änderung vorgenommen wurde.

Währungskurse

| Währung | Änderungsdatum | 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 |

Die obige Tabelle legt eine Gruppe nicht überlappender Intervalle fest. Das Startdatum ist dabei Change Date und das Enddatum wird durch das darauf folgende Intervall festgelegt. Da das Enddatum nicht explizit in einer gesonderten Spalte gespeichert ist, muss diese Spalte erstellt werden, damit in der neuen Tabelle eine Liste mit Intervallen angegeben werden kann.

Gehen Sie folgendermaßen vor:

1. Erstellen Sie eine neue App und geben Sie ihm einen Namen.

2. Fügen Sie einen neuen Skriptabschnitt im Dateneditor hinzu.

3. Fügen Sie die folgende Inline-Tabelle hinzu. Achten Sie darauf, dass die Daten in der Spalte Change Date dasselbe Format wie das lokale Datumsformat aufweisen.

   ```
   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. Bestimmen Sie den Datumsbereich, in dem Sie arbeiten möchten. Der Start des Bereichs muss vor dem ersten Datum liegen, das in den Daten enthalten ist, und das Ende des Bereichs nach dem letzten Datum in den Daten liegen.

   Fügen Sie am Anfang Ihres Skripts Folgendes hinzu:

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

5. Laden Sie die Quelldaten, aber ändern Sie leere Daten wie im vorherigen Stichpunkt beschrieben zum Beginn des Bereichs. Das Änderungsdatum sollte als "From Date" geladen werden.

   Sortieren Sie die Tabelle zunächst nach Currency und anschließend nach "From Date" in absteigender Reihenfolge, sodass die neuesten Datumsangaben oben angezeigt werden.

   Fügen Sie Folgendes nach der In\_Rates-Tabelle hinzu:

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

6. Führen Sie einen zweiten Lauf über die Daten aus, in dem der Wert "To Date" berechnet wird. Wenn sich die Währung des aktuellen Datensatzes von der des vorherigen unterscheidet, handelt es sich dabei um den ersten Datensatz einer neuen Währung (aber zugleich um das letzte Intervall). Deshalb sollten Sie das in Schritt 1 definierte Bereichsende verwenden. Handelt es sich um dieselbe Währung, sollten Sie das "From Date" des vorherigen Datensatzes verwenden, eine geringe Zeitspanne abziehen und diesen Wert als "To Date" für den aktuellen Datensatz verwenden.

   Fügen Sie Folgendes nach der Tmp\_Rates-Tabelle hinzu:

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

   Ihr Skript sollte folgendermaßen aussehen:

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

Das Skript aktualisiert die Quelltabelle folgendermaßen:

Aktualisierte Quelltabelle

| Währung | Rate | 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 |

In Ihrer App wird die Tabelle wie folgt angezeigt:

Vorschau der Daten

| Währung | Rate | 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 |

Die Tabelle lässt sich anschließend mithilfe der Intervalmatch-Methode zum Vergleich mit einem vorhandenen Datum einsetzen.

## Weitere Informationen

* [Einordnung diskreter Werte in Intervalle](https://help.qlik.com/de-DE/sense/November2024/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)