如何在BigQuery标准SQL中获取日期对应的月份周数?
在BigQuery标准SQL中实现类似PostgreSQL的月份周数格式
我明白你想要在BigQuery里复刻PostgreSQL中To_char(current_date, 'YYYY-MM-W')的效果——输出日期对应的年-月-当月周数格式,比如2018年4月25日会返回2018-04-4。BigQuery没有直接对应这个需求的内置函数,但我们可以通过简单的逻辑计算来实现:
核心思路
PostgreSQL的'W'格式符是按当月第一天起每7天为一周计算周数的(第一周为当月1-7号,第二周8-14号,以此类推,周数从1开始)。我们在BigQuery里可以完全复刻这个逻辑:
- 获取目标日期所在月份的第一天
- 计算目标日期和当月第一天的天数差
- 用天数差除以7取整后加1,得到当月的周数
- 把年份、月份和周数拼接成想要的格式
实现代码
针对指定日期(比如你的示例日期2018-04-25)
WITH sample_date AS ( SELECT DATE('2018-04-25') AS target_date -- BigQuery日期格式为YYYY-MM-DD ) SELECT CONCAT( FORMAT_DATE("%Y-%m", target_date), '-', CAST(FLOOR(DATE_DIFF(target_date, DATE_TRUNC(target_date, MONTH), DAY) / 7) + 1 AS STRING) ) AS month_week_result FROM sample_date;
执行后会返回2018-04-4,和PostgreSQL的结果完全一致。
针对当前日期
如果要处理当前日期,直接把target_date替换成CURRENT_DATE()即可:
SELECT CONCAT( FORMAT_DATE("%Y-%m", CURRENT_DATE()), '-', CAST(FLOOR(DATE_DIFF(CURRENT_DATE(), DATE_TRUNC(CURRENT_DATE(), MONTH), DAY) / 7) + 1 AS STRING) ) AS month_week_result;
边界情况验证
比如4月30日(当月最后一天),用这个逻辑计算:
- 当月第一天是4月1日,天数差是29天
29/7=4.14,取整后加1得到5,最终输出2018-04-5,这和PostgreSQL中To_char('2018-04-30'::date, 'YYYY-MM-W')的结果一致。
内容的提问来源于stack exchange,提问作者user9322003
相关产品推荐
相关产品推荐

