当前与上一自然年度营收对比图表日期编码实现咨询
跨年度营收同比对比日期获取实现方案
以下方案覆盖后端开发、前端图表渲染、数据库查询三类常用场景,同时适配「完整自然年对比」「截止到今日的当年/上年同期对比」两种需求:
Python 实现(基于标准库 datetime)
from datetime import datetime, date # 获取当前日期 today = date.today() current_year = today.year last_year = current_year - 1 # 场景1:完整自然年起止 current_year_start = date(current_year, 1, 1) current_year_end = date(current_year, 12, 31) last_year_start = date(last_year, 1, 1) last_year_end = date(last_year, 12, 31) # 场景2:截止到今日的同期对比(上年结束日期为去年今日) # 处理闰年2月29日特殊情况 try: last_year_today = date(last_year, today.month, today.day) except ValueError: # 当年是闰年且今日为2月29日,上年同期取2月28日 last_year_today = date(last_year, 2, 28) current_period_start = current_year_start current_period_end = today last_period_start = last_year_start last_period_end = last_year_today
SQL 实现(兼容MySQL/PostgreSQL)
可直接在数据查询阶段计算时间范围,无需额外代码处理:
-- 当年1月1日 SELECT DATE_FORMAT(CURDATE(), '%Y-01-01') AS current_year_start; -- 当年今日 SELECT CURDATE() AS current_year_end; -- 上年1月1日 SELECT DATE_FORMAT(CURDATE() - INTERVAL 1 YEAR, '%Y-01-01') AS last_year_start; -- 上年今日(自动处理闰年问题) SELECT DATE_SUB(CURDATE(), INTERVAL 1 YEAR) AS last_year_end; -- 月度营收同比查询示例 SELECT DATE_FORMAT(create_time, '%Y-%m') AS month, SUM(amount) AS current_year_revenue, (SELECT SUM(amount) FROM revenue WHERE create_time BETWEEN DATE_SUB(DATE_FORMAT(create_time, '%Y-%m-01'), INTERVAL 1 YEAR) AND LAST_DAY(DATE_SUB(create_time, INTERVAL 1 YEAR))) AS last_year_revenue FROM revenue WHERE create_time >= DATE_FORMAT(CURDATE(), '%Y-01-01') GROUP BY month;
JavaScript 实现(前端图表渲染用)
const today = new Date(); const currentYear = today.getFullYear(); const lastYear = currentYear - 1; // 完整自然年起止 const currentYearStart = new Date(currentYear, 0, 1); const currentYearEnd = new Date(currentYear, 11, 31); const lastYearStart = new Date(lastYear, 0, 1); const lastYearEnd = new Date(lastYear, 11, 31); // 截止到今日的同期对比 const lastYearToday = new Date(lastYear, today.getMonth(), today.getDate()); // 闰年兼容:如果JS自动把2月29日转到3月1日,强制修正为上年2月28日 if (lastYearToday.getMonth() !== today.getMonth()) { lastYearToday.setMonth(today.getMonth(), 28); }
注意事项
- 统计营收时建议将结束时间的时分秒设为
23:59:59,避免漏掉当日最后生成的订单数据 - 若需按周/季度维度同比,只需将日期的起止值替换为对应周期的首尾即可,逻辑完全通用
- 如涉及多时区数据,需统一转换为业务所在时区后再计算日期范围,避免统计偏差
内容的提问来源于stack exchange,提问作者A Kwarts
相关产品推荐
相关产品推荐

