下面试试
SELECT
start_date,
business_day,
DAYOFWEEK(business_day) AS day_of_week,
ROW_NUMBER() OVER(PARTITION BY start_date ORDER BY business_day) AS business_day_number
FROM (
SELECT
start_date, DATE(DATE_ADD(TIMESTAMP(start_date), pos - 1, "DAY")) AS business_day
FROM (
SELECT start_date, ROW_NUMBER() OVER() AS pos
FROM (FLATTEN((
SELECT start_date, SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(end_date), TIMESTAMP(start_date)), '.'),'') AS h
FROM
(SELECT '2016-01-01' AS start_date, '2016-01-31' AS end_date),
(SELECT '2016-03-01' AS start_date, '2016-03-31' AS end_date),
(SELECT '2016-06-01' AS start_date, '2016-06-30' AS end_date)
), h
)))
HAVING DAYOFWEEK(business_day) NOT IN (1,7)
)
在我看来 - 你改变了原来的问题 - 所以我觉得提供单独的答案而不是添加到我原来的答案是合适的
表名会去哪里?
假设 YourTable 如下所示:
start_date end_date
2016-01-01 2016-01-31
2016-03-01 2016-03-31
2016-06-01 2016-06-30
查询看起来像
SELECT
start_date,
business_day,
DAYOFWEEK(business_day) AS day_of_week,
ROW_NUMBER() OVER(PARTITION BY start_date ORDER BY business_day) AS business_day_number
FROM (
SELECT
start_date, DATE(DATE_ADD(TIMESTAMP(start_date), pos - 1, "DAY")) AS business_day
FROM (
SELECT start_date, ROW_NUMBER() OVER() AS pos
FROM (FLATTEN((
SELECT start_date, SPLIT(RPAD('', 1 + DATEDIFF(TIMESTAMP(end_date), TIMESTAMP(start_date)), '.'),'') AS h
FROM YourTable), h
)))
HAVING DAYOFWEEK(business_day) NOT IN (1,7)
)