Переход на летнее время в триггере (фабрика данных v2)

Как я могу установить триггер в конвейере (фабрика данных v2) для планирования определенного часа начала для страны с переходом на летнее время?

Не могли бы вы уточнить запрос? Беспокоитесь ли вы, что если вы запланируете триггер (скажем) на 1:30 утра, то он будет пропущен один день в год и выполняться дважды в один день в год? Вы нужно планируете запускать триггер на местное время, которое пропускается / неоднозначно при переходах на летнее время?

Jon Skeet 10.08.2018 16:30

Например, в странах, которые использовали летнее время Западной Европы, час изменится на 6 месяцев +1 час по сравнению с часом UTC. Идея будет иметь один и тот же час круглый год для одного и того же региона, что можно определить в мониторе DFv2.

ptfaferreira 10.08.2018 17:06
1
2
1 362
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Согласно документация, хотя для триггера есть свойство часового пояса, в настоящее время поддерживается только UTC. Если поддерживаются другие часовые пояса, указание этого часового пояса приведет к срабатыванию триггера в это местное время.

Я не пробовал этого, и это немного взломано, но в качестве обходного пути не могли бы вы перейти на почасовой запланированный триггер, а затем передать время срабатывания UTC в конвейер. Затем у вас может быть другой параметр триггера, который представляет собой часовой пояс и фактическое время, когда вы хотите выполнить.

На первом этапе конвейера будет задействована функция Azure, которая преобразует время в ваш местный часовой пояс (что учитывает переход на летнее время). Оператор IF затем завершится или продолжится, если полученное время совпадет с запрошенным часом часового пояса.

В интересах экономии времени / затрат / технического долга я, вероятно, не стал бы этого делать - я бы просто вручную отработал другое и обновил бы его, когда произойдет переход на летнее время.

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

Я нашел простой способ - запустить конвейер со следующим условием if.

if(Equals(addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH'),utcNow('HH')),true,false)

Давайте разберем if на следующие строки ...

1. if(
2. Equals(
3. addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH')
4. ,utcNow('HH')
5. )
6. ,true,false)

В строке 3 мы получаем текущее время в формате UTC (19:30) и конвертируем в CST (15:30), добавляем 5 часов, а затем берем только значение часов. 19:30 >> 15:30 + 5:00 = 19

В строке 4 мы получаем метку времени в формате UTC и извлекаем только часы (HH), в данном случае это 19.

Наконец, это завернуто в оператор «Равно»… если значения двух часов равны, то истинно, иначе - ложно.

Если это так, мы ничего не делаем и переходим к следующему этапу конвейера. Если false, то мы больше не находимся в режиме летнего времени и ждем один час, чтобы продолжить. Я обнаружил, что это работает, даже когда разница между UTC и CST составляет полночь.

Ниже представлен файл json….

{
  "name": "If DST",
  "type": "IfCondition",
  "dependsOn": [],
  "userProperties": [],
  "typeProperties": {
    "expression": {
      "value": "@if(Equals(addHours(convertTimeZone(utcNow(), 'UTC', 'Central Standard Time'), 5, 'HH'),utcNow('HH')),true,false)",
      "type": "Expression"
    },
    "ifFalseActivities": [
      {
        "name": "Wait 1 hour",
        "type": "Wait",
        "dependsOn": [],
        "userProperties": [],
        "typeProperties": {
          "waitTimeInSeconds": 3600
        }
      }
    ]
  }
}

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