Zu Hauptinhalt springen Zu ergänzendem Inhalt springen

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.

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

  1. Erstellen Sie eine neue Anwendung und geben Sie ihr 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 Datumsangaben in der Spalte Change Date dasselbe Format wie das lokale Datumsformat aufweisen.
  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. 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);

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

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

  8. 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ährungBewertenFromDateToDate
EUR8.4515/02/2013vEndTime
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

In Ihrer Anwendung sieht die Tabelle wie folgt aus:

Vorschau der Daten
WährungBewertenFromDateToDate
EUR8.4515/02/201301/03/2013
EUR8.6928/01/201314/02/2013
EUR8.5901/01/201328/01/2013
USD6.3003/02/201301/03/2013
USD6.5610/01/20132/02/2013
USD6.5001/01/20139/01/2013

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

Hat diese Seite Ihnen geholfen?

Wenn Sie ein Problem mit dieser Seite oder ihrem Inhalt feststellen, sei es ein Tippfehler, ein ausgelassener Schritt oder ein technischer Fehler, informieren Sie uns bitte!