Я пытаюсь вернуть массив дат в фабрику данных. Но я просто хочу, чтобы пользователь указал диапазон дат с двумя параметрами, startDate и endDate :
Я хочу вернуть этот массив, указав «12-08-2020» и «12-13-2020» в триггере:
["12-08-2020","12-09-2020","12-10-2020","12-12-2020","12-13-2020"]
Пока не нашел простого способа сделать это. Один из способов, о котором я подумал, был бы:
Но это кажется громоздким и излишним. Есть ли более простой способ сделать это?
РЕДАКТИРОВАТЬ :
Этот ответ кажется актуальным (сначала я его не видел): Выполнить действие foreach фабрики данных Azure с датой начала и датой окончания
Я думаю, что мы можем использовать рекурсивный запрос в поиске.
Псевдокод выглядит следующим образом:
В 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}'
для возврата строки даты, примечание: снаружи есть пара одинарных кавычек.
Я установил два параметра следующим образом:
Введите следующий код в действие поиска.
;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
Не выбирайте только первую строку.
У меня был аналогичный вариант использования, и в итоге я использовал «До тех пор» с небольшими изменениями. Два параметра, которые принимают два параметра 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. Требуется всего пара поправок для учета типов данных и странностей синтаксиса в фабрике:
Предполагая, что 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) на самом деле не работает из-за этой странности.
Добавьте Flatten после производного столбца. «Разверните» в новом поле массива и убедитесь, что все входные столбцы, которые вы хотите отобразить, правильно, как вам нравится. Это создает вертикальный стек, по одной строке на дату,
Добавьте еще один производный столбец, чтобы преобразовать новое поле из строки в дату, используя соответствующую функцию toDate().
Привет @GuillaumeLabs, я обновил свой ответ. Я думаю, что использовать поисковую активность проще.