如何在指定日期范围内排除当月天数少于下月的跨月周?
需求实现方案
一、排除日期范围内下月天数占比更多的周
核心判断逻辑:针对日期范围内的每一周,统计该周落在当前月份的天数,以及落在下一个月份的天数,若当月天数 < 下月天数,则将该周排除。
具体执行步骤
- 先明确周的起始规则(ISO标准为周一当周首日,也可按业务需求设为周日),遍历指定日期范围内的所有周
- 拆分每个周的所有日期,分别统计这些日期中属于当前月份、下一个月份的天数
- 对比两个天数数值:若当月天数少于下月天数,将该周从结果集中移除
典型排除案例
比如2022年的第52周、2023年的第5周,这两个周在1月的天数少于2月的天数,符合排除条件,需从目标日期范围中剔除。
二、生成带月份标识的ISO周日期表
参照ISO周日期规则生成按年份分组的周表,新增月份标识列(可标注周内覆盖的所有月份,或按周内天数占比最高的月份作为归属月份)。
参考表结构
| 年份 | ISO周数 | 周起始日期 | 周结束日期 | 月份标识 |
|---|---|---|---|---|
| 2023 | 1 | 2022-12-26 | 2023-01-01 | 12月/1月 |
| 2023 | 2 | 2023-01-02 | 2023-01-08 | 1月 |
| 2023 | 3 | 2023-01-09 | 2023-01-15 | 1月 |
| 2023 | 5 | 2023-01-23 | 2023-01-29 | 1月 |
| 2023 | 6 | 2023-01-30 | 2023-02-05 | 1月/2月 |
关键实现细节
- 遵循ISO周规则生成年度周数据(一年最多包含53个ISO周)
- 月份标识可灵活设置:若周跨两个月则标注两个月份,若仅在一个月内则标注单一月份;也可按周内天数占比最高的月份作为唯一标识
- 支持按指定的StartDate和EndDate过滤生成的周表,仅保留日期范围内的周数据
内容的提问来源于stack exchange,提问作者Iulian Glăvan
相关产品推荐
相关产品推荐

