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.

Diese 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 Datei mit dem Namen Rates.xlsx, welche die oben dargestellte Tabelle enthält und speichern Sie sie so, dass sie geladen werden kann.
  2. Achten Sie darauf, dass die Daten in der Spalte Change Date dasselbe Format wie das lokale Datumsformat aufweisen.

  3. 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.
  4. 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.
  5. Sortieren Sie die Tabelle zunächst nach Currency und anschließend nach "From Date" in absteigender Reihenfolge, sodass die neuesten Daten oben angezeigt werden.
  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 dabei um dieselbe Währung, sollten Sie das „From Date“ des vorhergehenden Datensatzes verwenden, eine geringe Zeitspanne abziehen und diesen Wert als „To Date“ für den aktuellen Datensatz verwenden.

Das nachfolgend aufgeführte Skript aktualisiert die Quelltabelle folgendermaßen:

Das QlikView-Skript sieht folgendermaßen aus:

Let vBeginTime = Num('1/1/2013');
Let vEndTime = Num('1/3/2013');
Let vEpsilon = Pow(2,-27);
Tmp_Rates:
LOAD Currency, Rate,
Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
From 'C:\MyFiles\Rates.xlsx'
(ooxml, embedded labels, table is Sheet1);
 
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;

 

Bei der Ausführung des Skripts ergibt sich eine Tabelle, welche die Intervalle richtig auflistet.

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