如何在SQL中按四月至四月日历计算日期所属周数
验证自定义财年(4月-次年3月)周数计算SQL的方法
核心验证步骤
明确周数规则细节
先确认你的SQL逻辑中两个关键规则:- 每周起始日:是周一还是周日?不同SQL方言的
WEEK类函数默认规则差异很大,比如MySQL的WEEK()有8种模式可选 - 第1周定义:是包含4月1日的周,还是当年4月第一个完整的周?
- 每周起始日:是周一还是周日?不同SQL方言的
覆盖关键测试场景
针对以下边界日期编写测试用例,确保逻辑无遗漏:- 财年起始日:如
2023-04-01、2024-04-01 - 财年结束日:如
2024-03-31、2025-03-31 - 跨财年日期:如
2024-03-30(属于2023/24财年)、2024-04-02(属于2024/25财年) - 含53周的特殊财年:比如财年起始日为周一,或整个财年有366天且第一周起始日较早的情况(例如2020/21财年:2020-04-01是周三,2021-03-31是周三,全年366天,对应53周)
- 财年起始日:如
逐例对比验证
对每个测试用例,先手动计算预期周数,再对比SQL输出:- 步骤1:确定日期所属财年:若
my_date月份≥4,财年为YEAR(my_date);否则为YEAR(my_date)-1 - 步骤2:找到该财年的第一天(
财年-04-01)和最后一天(财年+1-03-31) - 步骤3:计算
my_date与财年第一天的天数差,结合每周起始日规则推导周数 - 步骤4:将手动结果与SQL输出逐一对比,所有用例匹配则逻辑正确
- 步骤1:确定日期所属财年:若
示例验证流程
假设你的SQL逻辑如下(以MySQL为例):
SELECT my_date, -- 计算财年归属 CASE WHEN MONTH(my_date) >= 4 THEN YEAR(my_date) ELSE YEAR(my_date) - 1 END AS fiscal_year, -- 以周一为周起始,包含4月1日的周为第1周 WEEK(DATE_ADD(my_date, INTERVAL (4 - MONTH(my_date)) MONTH), 1) AS fiscal_week FROM some_table;
对应测试用例及预期:
| my_date | 预期fiscal_year | 预期fiscal_week |
|---|---|---|
| 2023-04-01 | 2023 | 1 |
| 2024-03-31 | 2023 | 52 |
| 2024-04-01 | 2024 | 1 |
| 2020-03-31 | 2019 | 53 |
将测试数据插入some_table后执行SQL,对比输出与预期结果即可完成验证。
内容的提问来源于stack exchange,提问作者stats_noob




