Получение 15-го числа последнего рабочего дня date-yyyyMMdd (исключая только выходные дни) в Hive - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть таблица со столбцом date ( date в формате строки yyyyMMdd ). Мое требование состоит в том, чтобы спроектировать логи c для извлечения данных из таблицы, где «значение столбца даты равно дате 15-го предыдущего рабочего дня» (исключая только субботы и воскресенья) без использования UDF или сценария оболочки. Например, сегодня 21 февраля 2020 года; логика c должна выдавать вывод: 20200203.

1 Ответ

0 голосов
/ 21 февраля 2020

Предполагая, что вы на самом деле имеете в виду 14-й предыдущий рабочий день, основываясь на своем примере, и игнорируете праздничные дни, это просто функция date_sub с оператором case для дня недели.

case from_unixtime(unix_timestamp(event_date,'yyyyMMdd'),'u')
  when 1 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
  when 2 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
  when 3 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
  when 4 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),20),'-','')
  when 5 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),18),'-','')
  when 6 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),18),'-','')
  when 7 then regexp_replace(date_sub(from_unixtime(unix_timestamp(event_dt,'yyyymmdd' )),19),'-','')
end as new_date

Это предполагает Сб / вс следует рассматривать как понедельник. Если сб / вс должно быть как пятница, то используйте 19, 20.

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

...