Фабрика данных Azure: возвращает массив дат из указанного диапазона

Я пытаюсь вернуть массив дат в фабрику данных. Но я просто хочу, чтобы пользователь указал диапазон дат с двумя параметрами, startDate и endDate :

Я хочу вернуть этот массив, указав «12-08-2020» и «12-13-2020» в триггере:

["12-08-2020","12-09-2020","12-10-2020","12-12-2020","12-13-2020"]

Пока не нашел простого способа сделать это. Один из способов, о котором я подумал, был бы:

  • добавить действие поиска в измерении даты,
  • затем добавьте два фильтра, чтобы выбрать только те элементы, которые больше startDate и меньше endDate.

Но это кажется громоздким и излишним. Есть ли более простой способ сделать это?


РЕДАКТИРОВАТЬ :


Этот ответ кажется актуальным (сначала я его не видел): Выполнить действие foreach фабрики данных Azure с датой начала и датой окончания

Привет @GuillaumeLabs, я обновил свой ответ. Я думаю, что использовать поисковую активность проще.

Joseph Xu 14.12.2020 08:28
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java
Работа с датами и временем в языке Java была сильно переработана начиная с версии Java 8 и далее с появлением библиотеки java.time.
2
1
2 119
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я думаю, что мы можем использовать рекурсивный запрос в поиске. Псевдокод выглядит следующим образом:
В sql мы можем использовать этот запрос для получения таблицы:

;with temp as 
(
    select CONVERT(varchar(100),'12-08-2020', 110) as dt
union all 
    select CONVERT(varchar(100), DATEADD(day,1,dt), 110) from temp
    where datediff(day,CONVERT(varchar(100), DATEADD(day,1,dt), 110),'12-13-2020')>=0
) select * from temp    

Результат такой:

Итак, в ADF, я думаю, мы можем использовать SQL-запрос Lookup, чтобы вернуть результат, который вы хотите.

Согласно этому официальному документу, нам нужно только заменить параметры оператора sql.

Далее я буду использовать '@{pipeline().parameters.startDate}' для возврата строки даты, примечание: снаружи есть пара одинарных кавычек.

  1. Я установил два параметра следующим образом:

  2. Введите следующий код в действие поиска.

;with temp as 
(
    select CONVERT(varchar(100),'@{pipeline().parameters.startDate}', 110) as dt
union all 
    select CONVERT(varchar(100), DATEADD(day,1,dt), 110) from temp
    where datediff(day,CONVERT(varchar(100), DATEADD(day,1,dt), 110),'@{pipeline().parameters.endDate}')>=0
) select * from temp

Не выбирайте только первую строку.

  1. Результат отладки следующий:

У меня был аналогичный вариант использования, и в итоге я использовал «До тех пор» с небольшими изменениями. Два параметра, которые принимают два параметра start_day и end_day

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

и, наконец, выражение в блоке «до тех пор»

@less(int(adddays(pipeline().parameters.end_day, 0, 'yyyyMMdd')), int(adddays(pipeline().parameters.start_day, int(variables('counter')), 'yyyyMMdd')))

последнее замечание: блок until выполняется, когда выражение возвращает false и выходит из цикла на true

Мне удалось получить что-то похожее на работу с комбинацией преобразования производного столбца с использованием функции mapLoop(), за которой следует преобразование flatten.

Выражение производного столбца сначала вычисляет массив дат в одном столбце.

mapLoop(toInteger((To_Date - From_Date)/86400000)),toDate(addDays(From_Date,#index)))

где 86400000 - количество миллисекунд в 24 часах

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

Я не могу комментировать ответ bmaci, так как у меня нет репутации, но это решение, если вы затем хотите использовать свой массив для генерации строк, по одной для каждой даты в массиве между startDate и endDate. Требуется всего пара поправок для учета типов данных и странностей синтаксиса в фабрике:

  1. Предполагая, что startDate и endDate являются полями даты, создайте производный столбец с выражением:

    mapLoop(({endDate}-{startDate})+1, toString(addDays({startDate}-1,#index)))

    Это создает массив строк от startDate до endDate, но учитывает тот факт, что первый индекс равен 1, а не 0. Если вы не включили часть -1 в функцию addDays(), первый элемент в массиве будет startDate + 1 день, а это не то, что вам нужно.

    Кроме того, часть toString() связана с тем, что вывод функции mapLoop() кажется массивом только строк. Даже официальный пример mapLoop() для mapLoop(3, #index * 10) на самом деле не работает из-за этой странности.

  2. Добавьте Flatten после производного столбца. «Разверните» в новом поле массива и убедитесь, что все входные столбцы, которые вы хотите отобразить, правильно, как вам нравится. Это создает вертикальный стек, по одной строке на дату,

  3. Добавьте еще один производный столбец, чтобы преобразовать новое поле из строки в дату, используя соответствующую функцию toDate().

Другие вопросы по теме

Azure DataFactory — можем ли мы заказать источник CopyData перед приемом?
Как проверить имена столбцов и порядок столбцов в фабрике данных Azure
Выражение для последнего ненулевого значения или нулевого значения в столбце таблицы базы данных с фабрикой данных Azure
Фабрика данных Azure передает «имя API-интерфейса объекта» таблиц Salesforce в качестве параметра из ForEach
Резервное копирование и восстановление схемы базы данных SQL Azure
Как получить информацию о том, когда в последний раз регистрировался ключ среды выполнения интеграции с самостоятельным размещением?
Как проверить поле даты в потоках сопоставления фабрики данных Azure в условном операторе разделения
Поддерживает ли Purview информацию о происхождении для встроенных наборов данных потока данных ADF?
Поддержка Azure Purview для приемника формата Delta в потоке данных ADF
Зарегистрируйте состояние запуска конвейера ADF (Azure Data Factory)