BigQuery中GENERATE_DATE_ARRAY的INTERVAL月末日期异常问询
问题原因及解决方法
这不是Bug,是GENERATE_DATE_ARRAY的逻辑特性导致的。你用的起始日期是2020-12-31,函数会按这个日期的日分量(31号)逐月累加:
- 第一次加1个月:
2020-12-31+ 1个月 →2021-01-31(正常,1月有31日) - 第二次加1个月:
2021-01-31+ 1个月 → 二月没有31日,自动调整为当月最后一天2021-02-28 - 之后每次加1个月,都是基于
28日计算,所以三月变成2021-03-28,四月2021-04-28,直到结束日期自然全是28日。
正确实现方式
要生成两个日期之间的所有月末日期,推荐以下两种方法:
方法一:先生成每月第一天,再转月末
SELECT ARRAY( SELECT LAST_DAY(day, MONTH) FROM UNNEST(GENERATE_DATE_ARRAY('2021-01-01', '2022-03-01', INTERVAL 1 MONTH)) AS day ) AS eom_dates
方法二:结合DATE_ADD与LAST_DAY生成序列
SELECT ARRAY( SELECT LAST_DAY(DATE_ADD('2020-12-31', INTERVAL i MONTH), MONTH) FROM UNNEST(GENERATE_ARRAY(0, DATE_DIFF('2022-03-31', '2020-12-31', MONTH))) AS i ) AS eom_dates
这两种方法都能准确生成2020-12-31、2021-01-31、2021-02-28、2021-03-31……直到2022-03-31的所有月末日期。
内容的提问来源于stack exchange,提问作者nicodds
相关产品推荐
相关产品推荐

