# 根据一个日期创建日期间隔

有时候，存储的时间间隔不含明确的开始和结束日期。相反，它们只由一个字段暗示 – 更改时间戳。

如下表所示，您可以拥有多种货币的货币汇率。每一种货币汇率变化都位于自己的行中；每一行都包含新的兑换率。此外，该表包含与进行第一次更换之前原始兑换率对应的空日期的行。

货币汇率

| 货币 | 更改日期 | 评价 |
| --- | --- | --- |
| 欧元 | - | 8.59 |
| 欧元 | 28/01/2013 | 8.69 |
| 欧元 | 15/02/2013 | 8.45 |
| 美元 | - | 6.50 |
| 美元 | 10/01/2013 | 6.56 |
| 美元 | 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;
   ```

该脚本将按以下方式更新源表：

更新后的源表

| 货币 | 评价 | FromDate | ToDate |
| --- | --- | --- | --- |
| 欧元 | 8.45 | 15/02/2013 | vEndTime |
| 欧元 | 8.69 | 28/01/2013 | 14/02/2013 23:59:59 |
| 欧元 | 8.59 | vBeginTime | 28/01/2013 23:59:99 |
| 美元 | 6.30 | 03/02/2013 | vEndTime |
| 美元 | 6.56 | 10/01/2013 | 2/02/2013 23:59:59 |
| 美元 | 6.50 | vBeginTime | 9/01/2013 23:59:59 |

在您的应用程序中，该表显示如下：

数据预览

| 货币 | 评价 | FromDate | ToDate |
| --- | --- | --- | --- |
| 欧元 | 8.45 | 15/02/2013 | 01/03/2013 |
| 欧元 | 8.69 | 28/01/2013 | 14/02/2013 |
| 欧元 | 8.59 | 01/01/2013 | 28/01/2013 |
| 美元 | 6.30 | 03/02/2013 | 01/03/2013 |
| 美元 | 6.56 | 10/01/2013 | 2/02/2013 |
| 美元 | 6.50 | 01/01/2013 | 9/01/2013 |

随后，在使用 Intervalmatch 方法与现有日期进行比较时可以使用该表。

## 了解详情

* [离散数据的匹配间隔](https://help.qlik.com/zh-CN/cloud-services/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)