Вот рабочая методика расчета рабочих дней между датами на основе работы в сообществе Looker Discourse здесь .Исходный пример для Redshift, поэтому я адаптировал его для BigQuery ниже.
SELECT
CAST(-1*(DATE_DIFF(DATE '2019-01-01', DATE '2019-01-31', DAY) - ((FLOOR(DATE_DIFF(DATE '2019-01-01', DATE '2019-01-31', DAY) / 7) * 2) +
CASE
WHEN EXTRACT(DAYOFWEEK FROM DATE '2019-01-01') - EXTRACT(DAYOFWEEK FROM DATE '2019-01-31') IN (1, 2, 3, 4, 5) AND EXTRACT(DAYOFWEEK FROM DATE '2019-01-31') != 0 THEN 2
ELSE 0
END +
CASE
WHEN EXTRACT(DAYOFWEEK FROM DATE '2019-01-01') != 0 AND EXTRACT(DAYOFWEEK FROM DATE '2019-01-31') = 0 THEN 1
ELSE 0
END +
CASE
WHEN EXTRACT(DAYOFWEEK FROM DATE '2019-01-01') = 0 AND EXTRACT(DAYOFWEEK FROM DATE '2019-01-31') != 0 THEN 1
ELSE 0 END)) AS int64) AS weekdays
Применяя это к вашему набору данных, мы получаем:
SELECT
order_date,
pickup_date,
CAST(-1*(DATE_DIFF(order_date, pickup_date, DAY) - ((FLOOR(DATE_DIFF(order_date, pickup_date, DAY) / 7) * 2) +
CASE
WHEN EXTRACT(DAYOFWEEK FROM order_date) - EXTRACT(DAYOFWEEK FROM pickup_date) IN (1, 2, 3, 4, 5) AND EXTRACT(DAYOFWEEK FROM pickup_date) != 0 THEN 2
ELSE 0
END +
CASE
WHEN EXTRACT(DAYOFWEEK FROM order_date') != 0 AND EXTRACT(DAYOFWEEK FROM pickup_date) = 0 THEN 1
ELSE 0
END +
CASE
WHEN EXTRACT(DAYOFWEEK FROM order_date) = 0 AND EXTRACT(DAYOFWEEK FROM pickup_date) != 0 THEN 1
ELSE 0 END)) AS int64) AS weekdays
FROM
`orders.table`