# Creación de un intervalo de fechas a partir de una sola fecha

En ocasiones, los intervalos de tiempo no se almacenan de forma explícita con un principio y un final. En su lugar, están implícitos solo por un campo: la fecha/hora del cambio.

Podría ser como en la tabla a continuación, en la que hay tipos de cambio para múltiples divisas: Cada cambio de tasa de divisa está en su propia fila, cada una de ella con una nueva tasa de conversión. Asimismo, la tabla contiene filas con fechas vacías que corresponden a la tasa de conversión inicial, antes de que se hiciera el primer cambio.

Tipos de cambio

| Moneda | Fecha de cambio | Tasa |
| --- | --- | --- |
| 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 |

La tabla anterior define un conjunto de intervalos que no se solapan, donde los datos de inicio se denominan Change Date y la fecha de finalización se define por el inicio del siguiente intervalo. Pero, ya que la fecha de finalización no se almacena de forma explícita en su propia columna, necesitamos crear esta columna para que la nueva tabla se convierta en una lista de intervalos.

Haga lo siguiente:

1. Cree una nueva aplicación y asígnele un nombre.

2. Agregue una nueva sección de script en el Editor de carga de datos.

3. Añada la siguiente tabla inline. Asegúrese de que las fechas de la columna Change Date estén en el mismo formato que el formato de fecha local.

   ```
   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. Determine con qué rango de fechas desea trabajar. El inicio del rango debe ser anterior a la primera fecha de los datos, y el final del rango debe ser posterior a la última.

   Agregue lo siguiente en la parte superior de su script:

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

5. Cargue los datos de origen, pero cambie las fechas vacías en el principio del rango definido en el punto anterior. La fecha de cambio debe cargarse como "From Date".

   Ordene la tabla primero según Currency, luego según "From Date" de forma descendente para que tenga las fechas más recientes en la parte superior.

   Agregue lo siguiente después de la tabla In\_Rates:

   ```
   Tmp_Rates:
   LOAD Currency, Rate,
       Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate
   Resident In_Rates;
   ```

6. Realice una segunda pasada por los datos donde calcule "To Date". Si el registro actual tiene una divisa distinta al registro anterior, entonces es el primer registro de una nueva divisa (pero su último intervalo), por lo que debería usar el final del rango definido en el paso 1. Si es la misma divisa, debería tomar "From Date" del registro anterior, restar una pequeña cantidad de tiempo y usar este valor como "To Date" en el registro actual.

   Añada lo siguiente después de la tabla 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;
   ```

   Su script debería tener el aspecto siguiente:

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

El script actualizará la tabla de origen de la siguiente forma:

Tabla de origen actualizada

| Moneda | Tasa | 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 |

En su aplicación, la tabla aparece de la siguiente manera:

Vista previa de datos

| Moneda | Tasa | 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 |

Esta tabla se puede usar posteriormente en una comparación con una fecha existente usando el método Intervalmatch.

## Más información

* [Emparejar intervalos con datos discretos](https://help.qlik.com/es-ES/sense/May2026/Subsystems/Hub/Content/Sense_Hub/LoadData/matching-intervals-to-discrete-data.htm)