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_day | current_date | period_start | period_end |
|---|---|---|---|
| 9 | 2021-06-14 | 2021-06-09 | 2021-07-09 |
| 25 | 2021-06-14 | 2021-05-25 | 2021-06-25 |
扩展说明:该逻辑天然支持所有小于等于28的账单日自动适配,若后续新增其他固定日出账的用户(如每月5日、15日、20日),无需修改代码逻辑,直接在用户表中维护对应bill_day字段值即可。
内容的提问来源于stack exchange,提问作者brienna
相关产品推荐
相关产品推荐

