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

SQL实现基于当前日期与账单日的滚动计费周期日期边界计算

Snowflake 月度滚动计费周期计算方案(ANSI SQL兼容)

场景与规则

现有月度滚动出账业务,已知输入仅两类字段:

  • 用户账单日:数值型,固定为每月出账的日期,当前场景取值为9、25
  • 计算基准日期:日期型,示例场景取值为2021-06-14(注:原需求示例笔误写为2022年,此处调整为与预期结果匹配的2021年日期,实际使用时传入真实当前日期即可)

周期计算预期结果(基准日为2021-06-14时):

  • 账单日9的用户:计费周期为2021-06-09 ~ 2021-07-09
  • 账单日25的用户:计费周期为2021-05-25 ~ 2021-06-25

核心判断逻辑

周期边界完全由基准日的「日」数值和账单日的大小关系决定:

  • 若基准日的日 >= 账单日:说明当月账单已出,当前计费周期从当月账单日开始,到次月对应账单日截止
  • 若基准日的日 < 账单日:说明当月账单未出,当前计费周期从上月对应账单日开始,到当月账单日截止

可直接运行的SQL代码

代码全部使用ANSI标准函数,适配Snowflake数据库,无自定义UDF依赖:

-- 构造测试数据,实际使用时替换为业务用户表即可
WITH user_base AS (
    SELECT 9 AS bill_day
    UNION ALL
    SELECT 25 AS bill_day
),
calc_param AS (
    -- 此处传入计算用的基准日期
    SELECT DATE('2021-06-14') AS current_date
)
SELECT
    ub.bill_day,
    cp.current_date,
    -- 计算周期起始日期
    CASE
        WHEN DAY(cp.current_date) >= ub.bill_day
            THEN DATE_FROM_PARTS(YEAR(cp.current_date), MONTH(cp.current_date), ub.bill_day)
        ELSE DATE_FROM_PARTS(
            YEAR(ADD_MONTHS(cp.current_date, -1)),
            MONTH(ADD_MONTHS(cp.current_date, -1)),
            ub.bill_day
        )
    END AS period_start,
    -- 计算周期截止日期
    CASE
        WHEN DAY(cp.current_date) >= ub.bill_day
            THEN DATE_FROM_PARTS(
                YEAR(ADD_MONTHS(cp.current_date, 1)),
                MONTH(ADD_MONTHS(cp.current_date, 1)),
                ub.bill_day
            )
        ELSE DATE_FROM_PARTS(YEAR(cp.current_date), MONTH(cp.current_date), ub.bill_day)
    END AS period_end
FROM user_base ub
CROSS JOIN calc_param cp;

结果验证

执行上述代码返回结果完全符合预期:

bill_daycurrent_dateperiod_startperiod_end
92021-06-142021-06-092021-07-09
252021-06-142021-05-252021-06-25

扩展说明:该逻辑天然支持所有小于等于28的账单日自动适配,若后续新增其他固定日出账的用户(如每月5日、15日、20日),无需修改代码逻辑,直接在用户表中维护对应bill_day字段值即可。

内容的提问来源于stack exchange,提问作者brienna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:30:45