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ährung | Datum ändern | Bewerten |
|---|---|---|
| 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:
- Erstellen Sie eine neue Anwendung und geben Sie ihr einen Namen.
- Fügen Sie einen neuen Skriptabschnitt im Dateneditor hinzu.
- Fügen Sie die folgende Inline-Tabelle hinzu. Achten Sie darauf, dass die Datumsangaben in der Spalte Change Date dasselbe Format wie das lokale Datumsformat aufweisen.
-
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); -
Laden Sie die Quelldaten, aber ändern Sie leere Daten wie im vorherigen Stichpunkt beschrieben zum Beginn des Bereichs. Das Änderungsdatum muss 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 nach der Tabelle In_Rates Folgendes hinzu:
Tmp_Rates: LOAD Currency, Rate, Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate Resident In_Rates; -
Führen Sie einen zweiten Durchlauf mit den Daten aus, wobei 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. Wenn es sich um die gleiche Währung handelt, müssen Sie "From Date" aus dem vorherigen Datensatz übernehmen, einen kurzen Zeitraum davon abziehen und diesen Wert als "To Date" im aktuellen Datensatz verwenden.
Fügen Sie nach der Tabelle Tmp_Rates Folgendes 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;
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
];
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:
| Währung | Bewerten | 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 Anwendung sieht die Tabelle wie folgt aus:
| Währung | Bewerten | 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.