You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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里可以完全复刻这个逻辑:

  1. 获取目标日期所在月份的第一天
  2. 计算目标日期和当月第一天的天数差
  3. 用天数差除以7取整后加1,得到当月的周数
  4. 把年份、月份和周数拼接成想要的格式

实现代码

针对指定日期(比如你的示例日期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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:19:33