# Создание интервала дат из одиночной даты

Иногда у интервалов времени нет четко выраженного начала и конца. Они подразумеваются только одним полем — меткой времени изменения.

Это может быть как в таблице ниже, где для различных валют указаны курсы валют. Каждый курс валют указан в отдельной строке, каждый — с новым обменным курсом. Также в таблице есть строки с пустыми датами, соответствующими исходному обменному курсу, который существовал до первого изменения.

Обменные курсы валют

| 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. Создайте файл с именем Rates.xlsx, содержащий таблицу, показанную выше, и сохраните его готовым к загрузке.

   Убедитесь, что даты в столбце Change Date указаны в локальном формате дат.
2. Определите временной диапазон, с которым вы хотели бы работать. Начало диапазона должно предшествовать первой дате в данных, а конец диапазона должен быть после последней даты.
3. Загрузите исходные данные, но измените пустые даты на начало диапазона, определенного в предыдущем маркере. Дата изменения должна быть загружена как «From Date».
4. Отсортируйте таблицу сначала по элементу Currency, а затем по элементу «From Date» в убывающем порядке, так чтобы последние даты оказались сверху.
5. Еще раз пройдитесь по данным, где вычисляется элемент «To Date». Если валюта текущей записи отличается от валюты предыдущей, то это первая запись новой валюты (но ее последнего интервала), поэтому следует использовать конец диапазона, определенного в шаге 1. Если это та же валюта, возьмите элемент «From Date» из предыдущей записи, вычтите небольшое количество времени и используйте это значение в текущей записи как элемент «To Date».

Указанный ниже скрипт обновит исходную таблицу следующим образом:

Обновленная таблица

| 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:59 |
| 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 |

Скрипт QlikView будет выглядеть так:

```
Let vBeginTime = Num('1/1/2013');
```

```
Let vEndTime = Num('1/3/2013');
```

```
Let vEpsilon = Pow(2,-27);
```

Tmp\_Rates:

LOAD Currency, Rate,

Date(If(IsNum([Change Date]), [Change Date], $(#vBeginTime))) as FromDate

From 'C:\MyFiles\Rates.xlsx'

(ooxml, embedded labels, table is Sheet1);

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;

После запуска этого скрипта вы получите таблицу с правильным перечислением интервалов.

Впоследствии эту таблицу можно использовать при сравнении с существующей датой с помощью функции Intervalmatch.

## Подробнее

* [Сопоставление интервалов с дискретными данными](https://help.qlik.com/ru-RU/qlikview/September2025/Subsystems/Client/Content/QV_QlikView/LoadData/matching-intervals-to-discrete-data.htm)