在BigQuery中提取各季度最后工作日的问题求助
提取季度最后工作日的BigQuery修正方案
你的问题出在直接取季度首日前一天,没考虑周末的情况。可以通过判断日期的星期几来调整,以下是能得到正确结果的代码:
SELECT -- 计算最后工作日:如果是周日减3天,周六减2天,其他日期减1天 CASE WHEN EXTRACT(DAYOFWEEK FROM DATE_SUB(example, INTERVAL 1 DAY)) = 1 THEN DATE_SUB(example, INTERVAL 3 DAY) WHEN EXTRACT(DAYOFWEEK FROM DATE_SUB(example, INTERVAL 1 DAY)) = 7 THEN DATE_SUB(example, INTERVAL 2 DAY) ELSE DATE_SUB(example, INTERVAL 1 DAY) END AS last_workday, -- 格式化对应的星期名称 FORMAT_DATE("%A", CASE WHEN EXTRACT(DAYOFWEEK FROM DATE_SUB(example, INTERVAL 1 DAY)) = 1 THEN DATE_SUB(example, INTERVAL 3 DAY) WHEN EXTRACT(DAYOFWEEK FROM DATE_SUB(example, INTERVAL 1 DAY)) = 7 THEN DATE_SUB(example, INTERVAL 2 DAY) ELSE DATE_SUB(example, INTERVAL 1 DAY) END ) AS weekday_name FROM UNNEST(GENERATE_DATE_ARRAY('2013-01-01', '2030-04-01', INTERVAL 3 MONTH)) AS example
关键逻辑说明:
- BigQuery里
EXTRACT(DAYOFWEEK FROM date)返回1代表周日,7代表周六 - 针对原季度最后一天(季度首日前一天)的星期情况做调整:
- 周日(值1):往前推3天到周五
- 周六(值7):往前推2天到周五
- 工作日则直接保留原日期
运行这段代码后,就能得到你期望的结果:比如2013-03-31(周日)会变成2013-03-29(周五),2013-06-30(周日)变成2013-06-28(周五),其余工作日保持不变。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

