從單一日期建立日期間隔

有時,儲存時間間隔時沒有明確提供開始時間和結束時間。相反,它們只藉助一個欄位來暗指 - 變更時間戳記。

這種情況可能如下表所示,您對多種貨幣設有不同的匯率。每種貨幣匯率只在它自己的列裡變更,分別帶有一個新的兌換率。另外,在第一次變更之前,表格含有對應於初始兌換率的空日期列。

貨幣匯率
貨幣 換匯日期 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

上述表格定義了一組不重疊時間間隔,開始的日期稱為 Change Date,結束日期由後續時間間隔的開始日期定義。但由於結束日期並未明確地儲存在自己的資料行中,所以我們需要建立這樣一個資料行,使新表格成為一個時間間隔清單。

請執行下列動作:

  1. 建立新的應用程式並命名。
  2. 資料載入編輯器中新增新的指令碼區段。
  3. 新增下列內嵌表格。確保 Change Date 資料行中的日期採用與本機日期相同的格式。
  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. 確定您想要使用的時間範圍。範圍的開始時間必須在資料的第一個日期之前,範圍的結束時間必須在最後一個日期之後。

    將下列內容新增至指令碼頂端:

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

  6. 載入來源資料,但將空日期變更為在前一個要點提示中定義的範圍起始時間。變更日期應被載入作為 "From Date"

    首先根據 Currency 排列表格,然後根據 "From Date" 降序排列,這樣最新的日期位於最頂部。

    In_Rates 之後新增下列內容:

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

  7. 對您計算 "To Date" 的資料執行第二次排序通過。如果當前記錄中的貨幣與先前記錄的貨幣不同,那麼它是新貨幣的第一個記錄 (但不是它的最後一個時間間隔),因此您應使用在第 1 步中定義的範圍結束時間。若這是相同的貨幣,您應從先前的記錄採取 "From Date",減去少量的時間,然後使用此值作為目前記錄中的 "To Date"

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

  8. 您的指令碼應如下所示:

    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;

指令碼會按以下方式更新來源表格:

已更新的來源表格
貨幣 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

在應用程式中,表格顯示如下:

資料預覽
貨幣 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

此表格隨後可用於採用 Intervalmatch 方法與現有日期進行對比。