# 単一の日付からの日付間隔の作成

時間の間隔が明示的に開始および終了を含むことなく保存される場合があります。代わりに、変更タイムスタンプという 1 つの項目により暗黙のうちに定義されています。

複数の通貨の現在のレートを記載した下記のテーブルがある場合、各通貨レートの変化は新しい変換レートとともにそれぞれの行に表示されています。また、テーブルには最初に変換が実施される前の、当初の変換レートに対応する日付が空の行も含まれています。

通貨レート

| 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 列の日付がローカル日付書式と同じ書式になっていることを確認します。

   ```
   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" を計算する 2 度目のデータ パス スルーを実行します。現在のレコードに前のレコードとは異なる通貨がある場合、それは新しい通貨の最初のレコードとなる (だが間隔は最後) ため、手順 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;
   ```

スクリプトは、次の方法でソース テーブルを更新します。

更新されたソース テーブル

| 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 メソッドを使用することにより、既存の日付との比較にこのテーブルを使用できます。

## 詳細を見る

* [不連続データと間隔の一致](https://help.qlik.com/ja-JP/sense/May2026/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)