# 從單一日期建立日期間隔

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

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

貨幣匯率

| 貨幣 | 換匯日期 | 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 資料行中的日期採用與本機日期相同的格式。

   ```
   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
   ];
   ```

4. 確定您想要使用的時間範圍。範圍的開始時間必須在資料的第一個日期之前，範圍的結束時間必須在最後一個日期之後。

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

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

5. 載入來源資料，但將空日期變更為在前一個要點提示中定義的範圍起始時間。變更日期應被載入作為 "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;
   ```

6. 對您計算 "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;
   ```

   您的指令碼應如下所示：

   ```
   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 方法與現有日期進行對比。

## 瞭解更多資訊

* [配對間隔和離散資料](https://help.qlik.com/zh-TW/sense/May2025/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)