從單一日期建立日期間隔
有時,儲存時間間隔時沒有明確提供開始時間和結束時間。相反,它們只藉助一個欄位來暗指 - 變更時間戳記。
這種情況可能如下表所示,您對多種貨幣設有不同的匯率。每種貨幣匯率只在它自己的列裡變更,分別帶有一個新的兌換率。另外,在第一次變更之前,表格含有對應於初始兌換率的空日期列。
貨幣 | 換匯日期 | 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,結束日期由後續時間間隔的開始日期定義。但由於結束日期並未明確地儲存在自己的資料行中,所以我們需要建立這樣一個資料行,使新表格成為一個時間間隔清單。
請執行下列動作:
- 建立新的應用程式並命名。
- 在資料載入編輯器中新增新的指令碼區段。
- 新增下列內嵌表格。確保 Change Date 資料行中的日期採用與本機日期相同的格式。
-
確定您想要使用的時間範圍。範圍的開始時間必須在資料的第一個日期之前,範圍的結束時間必須在最後一個日期之後。
將下列內容新增至指令碼頂端:
Let vBeginTime = Num('1/1/2013'); Let vEndTime = Num('1/3/2013'); Let vEpsilon = Pow(2,-27);
-
載入來源資料,但將空日期變更為在前一個要點提示中定義的範圍起始時間。變更日期應被載入作為 "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;
-
對您計算 "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;
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
];
您的指令碼應如下所示:
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 方法與現有日期進行對比。