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.
| 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:
- Cree una nueva aplicación y asígnele un nombre.
- Agregue una nueva sección de script en el Editor de carga de datos.
- 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.
-
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); -
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; -
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;
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
];
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:
| 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:
| 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.