同环比时间范围计算说明

这份文档用于说明系统在计算“同比、环比、周环比、季度环比”时,如何确定本期、同期、上期的时间范围。文档只描述业务口径,不涉及具体代码实现。

1. 先确定“本期”时间范围

同环比计算的第一步,不是直接找上期,而是先把“本期”定准。

1.1 如果用户问的是明确日期段

例如:

  • 2024年1月1日到2024年1月31日
  • 2024年6月9日到2024年6月13日

这类场景,本期就直接采用用户给出的时间范围。

1.2 如果用户问的是“今年 / 本月 / 本季度 / YTD / MTD / QTD”

这类场景,本期通常不会机械地取到自然结束日,而是会结合数据实际更新到哪一天来确定。

例如,假设今天是 2025年9月10日,数据实际只更新到 2025年9月9日:

  • “今年”按 2025年1月1日 到 2025年9月9日 计算
  • “本月”按 2025年9月1日 到 2025年9月9日 计算
  • “YTD”也按 2025年1月1日 到 2025年9月9日 计算
  • “MTD”也按 2025年9月1日 到 2025年9月9日 计算

这样做的目的,是保证同环比比较的是“已经有数据的天数”,避免把未来还没有发生的数据算进本期。

1.3 “今年”和“YTD”并不总是一样

如果某些表本身就存在未来日期的数据,例如全年目标表,那么:

  • “今年”可以是 2025年1月1日 到 2025年12月31日
  • “YTD”仍然只到当前可比较日期,例如 2025年9月9日

可以理解为:

  • “今年”强调自然年份口径
  • “YTD”强调“截至当前已发生进度”的口径

2. 同比如何确定“同期”

同比的核心规则很简单:

  • 默认把本期整体向前平移 1 年
  • 平移后,尽量保持“起止位置一致”

2.1 完整自然周期的同比

例1:本期是完整自然月

  • 本期:2024年3月1日 到 2024年3月31日
  • 同期:2023年3月1日 到 2023年3月31日

例2:本期是完整自然年

  • 本期:2024年1月1日 到 2024年12月31日
  • 同期:2023年1月1日 到 2023年12月31日

2.2 不完整周期的同比

例3:本期是月初到某一天

  • 本期:2024年6月1日 到 2024年6月23日
  • 同期:2023年6月1日 到 2023年6月23日

例4:本期是某一天

  • 本期:2024年1月2日
  • 同期:2023年1月2日

2.3 闰年处理

如果本期结束在月末,则同期也按上一年对应月份的月末处理。

例5:

  • 本期:2024年2月1日 到 2024年2月29日
  • 同期:2023年2月1日 到 2023年2月28日

这条规则的目的,是保证“整月对整月”。

3. 环比如何确定“上期”

环比的规则比同比更复杂,因为“上期”并不总是简单减一个月。系统会优先判断本期是不是一个“自然周期口径”。

3.1 本期是完整自然周期时

如果本期刚好是完整的年、季、月、周、日,那么上期取上一个完整自然周期。

例1:完整自然月

  • 本期:2024年1月1日 到 2024年1月31日
  • 上期:2023年12月1日 到 2023年12月31日

例2:完整自然周

  • 本期:2023年3月6日 到 2023年3月12日
  • 上期:2023年2月27日 到 2023年3月5日

例3:完整自然日

  • 本期:2022年1月2日
  • 上期:2022年1月1日

3.2 本期从自然周期起点开始,但没有走完整个周期时

如果本期是“从月初开始,到月中某一天结束”,或者“从周初开始,到周中某一天结束”,那么上期不是简单按天数回退,而是要保持同样的周期位置。

月度场景

例4:月初到某一天

  • 本期:2022年2月1日 到 2022年2月27日
  • 上期:2022年1月1日 到 2022年1月27日

这里的关键不是“27天”,而是“都取到各自月份的第27天结束”。

周度场景

例5:周初到周中某一天

  • 本期:2026年6月8日 到 2026年6月13日
  • 上期:2026年6月1日 到 2026年6月6日

这里保持的是“同样的周内位置”。

3.3 本期不是从自然周期起点开始的自定义区间

如果本期本身就是一个自由定义的时间段,不是从月初、周初、季初开始,那么上期按“等长平移”处理。

例6:

  • 本期:2026年6月9日 到 2026年6月13日
  • 上期:2026年6月4日 到 2026年6月8日

这类场景的理解方式是:

  • 本期有 5 天
  • 上期也取紧邻之前的 5 天

3.4 跨多个月的自定义时间段

如果本期本身覆盖多个完整月份,上期就整体向前平移相同的月数。

例7:

  • 本期:2024年2月1日 到 2024年3月31日
  • 上期:2023年12月1日 到 2024年1月31日

可以理解为:

  • 本期覆盖 2 个完整月份
  • 上期也取紧邻之前的 2 个完整月份

4. 周环比和季度环比

4.1 周环比

周环比本质上是和上一周比较。

例1:

  • 本期:2024年2月11日 到 2024年2月17日
  • 上期:2024年2月4日 到 2024年2月10日

需要注意的是,周的起始日要跟项目口径一致:

  • 有些项目按周一开始
  • 有些项目按周日开始

只要本期和上期采用同一套起始规则即可。

4.2 季度环比

季度环比本质上是和上一个季度的对应时间段比较。

例2:

  • 本期:2024年7月1日 到 2024年8月3日
  • 上期:2024年4月1日 到 2024年5月3日

如果本期是完整季度,则上期也是完整上一季度。

5. 按时间粒度分组展示时,比较口径要跟分组一致

报表如果按年、季、月、周等粒度展示,系统会优先让比较口径和展示粒度对齐。

5.1 按月展示同比

例1:

  • 查询范围:2024年1月1日 到 2024年12月31日
  • 展示方式:按月展示

那么实际比较关系是:

  • 2024年1月 对 2023年1月
  • 2024年2月 对 2023年2月
  • ...
  • 2024年12月 对 2023年12月

5.2 按月展示环比

例2:

  • 查询范围:2024年1月1日 到 2024年1月31日
  • 展示方式:按月展示

那么比较关系是:

  • 2024年1月 对 2023年12月

如果查询范围本身跨了多个月,则“上期”也会整体向前挪相同的月数。

6. 实施时最容易混淆的几个点

6.1 “环比”不等于“减一个月”

只有当本期本来就是月度口径时,环比才表现为“上个月”。

如果本期是:

  • 一天,则上期是前一天
  • 一周,则上期是前一周
  • 自定义 5 天,则上期是前一个 5 天区间
  • 月初到某日,则上期是上个月月初到对应日期

6.2 “同比”优先保持同位置,而不是同天数

例如:

  • 本期:2024年6月1日 到 2024年6月23日
  • 同期:2023年6月1日 到 2023年6月23日

这里强调的是“同一月份中的同一进度”,而不是简单地找一个 23 天区间。

6.3 “今年”和“YTD”要区分

尤其是在目标表、预算表这类可能包含未来日期的数据中:

  • “今年”可能是全年
  • “YTD”只能到当前已发生的日期

6.4 月末、季末、年末要按完整周期理解

例如:

  • 9月1日到9月30日,是完整自然月
  • 1月1日到12月31日,是完整自然年

这类场景在取上期或同期时,都应该优先按完整周期对齐,而不是按简单天数平移。

7. 一句话总结

可以把系统的同环比时间计算理解为三步:

  1. 先确定本期真实可比较的时间范围
  2. 再判断本期属于“完整自然周期”“从周期起点开始的不完整周期”还是“自由定义区间”
  3. 最后按“同位置对齐”或“等长平移”得到同期/上期

如果实施时拿不准,优先用下面这个判断顺序:

  • 先看本期是不是完整年、季、月、周、日
  • 再看本期是不是从周期起点开始
  • 如果都不是,就按等长平移处理