단일 날짜에서 날짜 간격 만들기

시간 간격은 시작 및 끝을 명시적으로 지정하여 저장되지 않는 경우가 있습니다. 대신 하나의 필드(타임스탬프 변경)를 통해 유추됩니다.

복수의 통화에 대한 환율은 아래 테이블과 같을 수 있습니다. 각 환율 변경은 각각의 행에서 새 전환율에 의해 이루어집니다. 또한 테이블에는 첫 번째 변경이 이루어지기 전의 초기 전환율에 해당하는 빈 날짜가 있는 행이 포함됩니다.

환율
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

위 테이블은 일련의 겹치지 않는 기간을 정의합니다. 시작 데이터는 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;

스크립트는 다음과 같은 방식으로 소스 테이블을 업데이트합니다.

업데이트된 소스 테이블
Currency 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

앱에서 테이블은 다음과 같이 나타납니다.

데이터 미리 보기
Currency 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 메서드를 사용하여 기존 날짜와 비교하는 데 사용할 수 있습니다.