跳到主要内容 跳到补充内容

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

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

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

货币汇率
货币更改日期评价
欧元-8.59
欧元28/01/20138.69
欧元15/02/20138.45
美元-6.50
美元10/01/20136.56
美元03/02/20136.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;

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

更新后的源表
货币评价FromDateToDate
欧元8.4515/02/2013vEndTime
欧元8.6928/01/201314/02/2013 23:59:59
欧元8.59vBeginTime28/01/2013 23:59:99
美元6.3003/02/2013vEndTime
美元6.5610/01/20132/02/2013 23:59:59
美元6.50vBeginTime9/01/2013 23:59:59

在您的应用程序中,该表显示如下:

数据预览
货币评价FromDateToDate
欧元8.4515/02/201301/03/2013
欧元8.6928/01/201314/02/2013
欧元8.5901/01/201328/01/2013
美元6.3003/02/201301/03/2013
美元6.5610/01/20132/02/2013
美元6.5001/01/20139/01/2013

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

本页面有帮助吗?

如果您发现此页面或其内容有任何问题 – 打字错误、遗漏步骤或技术错误 – 请告诉我们!